]> granicus.if.org Git - strace/commitdiff
util.c: make memory allocation error messages more informative
authorEugene Syromyatnikov <evgsyr@gmail.com>
Mon, 9 Apr 2018 15:14:40 +0000 (17:14 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 21 May 2018 11:02:54 +0000 (11:02 +0000)
As those are pretty unusual, let's add some additional information
that can be reported by users.

* util.c (print_quoted_string_ex, dumpstr): Add reasons for memory
allocation errors.
(sizeof_iov): Change type from size_t to unsigned int.
(dumpiov_upto): Rewrite size initialisation similarly to the way it's
done in print_quoted_string_ex, add reasons for memory allocation errors.

Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
util.c

diff --git a/util.c b/util.c
index ce81b3173c2e5f60dce2a32edd87b46a041dded3..8d54e773b669e8ac8abad66f563caa8603f99648 100644 (file)
--- a/util.c
+++ b/util.c
@@ -693,7 +693,8 @@ print_quoted_string_ex(const char *str, unsigned int size,
 
        alloc_size = 4 * size;
        if (alloc_size / 4 != size) {
-               error_func_msg("Out of memory");
+               error_func_msg("requested %u bytes exceeds %u bytes limit",
+                              size, -1U / 4);
                tprints("???");
                return -1;
        }
@@ -706,7 +707,8 @@ print_quoted_string_ex(const char *str, unsigned int size,
        } else {
                outstr = buf = malloc(alloc_size);
                if (!buf) {
-                       error_func_msg("Out of memory");
+                       error_func_msg("memory exhausted when tried to allocate"
+                                      " %u bytes", alloc_size);
                        tprints("???");
                        return -1;
                }
@@ -870,25 +872,30 @@ dumpiov_upto(struct tcb *const tcp, const int len, const kernel_ulong_t addr,
        } iovu;
 #define iov iovu.iov64
 #define sizeof_iov \
-       (current_wordsize == 4 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
+       (current_wordsize == 4 ? (unsigned int) sizeof(*iovu.iov32)     \
+                              : (unsigned int) sizeof(*iovu.iov64))
 #define iov_iov_base(i) \
        (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].base : iovu.iov64[i].base)
 #define iov_iov_len(i) \
        (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].len : iovu.iov64[i].len)
 #else
        struct iovec *iov;
-#define sizeof_iov sizeof(*iov)
+#define sizeof_iov ((unsigned int) sizeof(*iov))
 #define iov_iov_base(i) ptr_to_kulong(iov[i].iov_base)
 #define iov_iov_len(i) iov[i].iov_len
 #endif
        int i;
-       unsigned size;
+       unsigned int size = sizeof_iov * len;
+       if (size / sizeof_iov != (unsigned int) len) {
+               error_func_msg("requested %u iovec elements exceeds"
+                              " %u iovec limit", len, -1U / sizeof_iov);
+               return;
+       }
 
-       size = sizeof_iov * len;
-       /* Assuming no sane program has millions of iovs */
-       if ((unsigned)len > 1024*1024 /* insane or negative size? */
-           || (iov = malloc(size)) == NULL) {
-               error_func_msg("Out of memory");
+       iov = malloc(size);
+       if (!iov) {
+               error_func_msg("memory exhausted when tried to allocate"
+                              " %u bytes", size);
                return;
        }
        if (umoven(tcp, addr, size, iov) >= 0) {
@@ -938,7 +945,8 @@ dumpstr(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
                str = malloc(len + 16);
                if (!str) {
                        strsize = -1;
-                       error_func_msg("Out of memory");
+                       error_func_msg("memory exhausted when tried to allocate"
+                                      " %zu bytes", (size_t) (len + 16));
                        return;
                }
                strsize = len + 16;