SOURCES: strace-utilc.patch (NEW) - from http://git.altlinux.org/people/ldv...
paszczus
paszczus at pld-linux.org
Mon Apr 27 09:23:05 CEST 2009
Author: paszczus Date: Mon Apr 27 07:23:05 2009 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- from http://git.altlinux.org/people/ldv/packages/?p=strace.git;a=commitdiff;h=f46c65be75810812088b64fc05ecef8515d79b91#patch2
---- Files affected:
SOURCES:
strace-utilc.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/strace-utilc.patch
diff -u /dev/null SOURCES/strace-utilc.patch:1.1
--- /dev/null Mon Apr 27 09:23:06 2009
+++ SOURCES/strace-utilc.patch Mon Apr 27 09:23:00 2009
@@ -0,0 +1,179 @@
+--- util.c
++++ util.c
+@@ -407,6 +407,12 @@ unsigned long uid;
+
+ static char path[MAXPATHLEN + 1];
+
++/*
++ * Quote string `instr' of length `size'
++ * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
++ * If `len' < 0, treat `instr' as a NUL-terminated string
++ * and quote at most (`size' - 1) bytes.
++ */
+ static int
+ string_quote(const char *instr, char *outstr, int len, int size)
+ {
+@@ -417,12 +423,18 @@ string_quote(const char *instr, char *outstr, int len, int size)
+ if (xflag > 1)
+ usehex = 1;
+ else if (xflag) {
++ /* Check for presence of symbol which require
++ to hex-quote the whole string. */
+ for (i = 0; i < size; ++i) {
+ c = ustr[i];
+- if (len < 0 && i == size - 2 && c != '\0')
+- ++i;
+- if (len < 0 && c == '\0')
+- break;
++ /* Check for NUL-terminated string. */
++ if (len < 0) {
++ if (c == '\0')
++ break;
++ /* Quote at most size - 1 bytes. */
++ if (i == size - 1)
++ continue;
++ }
+ if (!isprint(c) && !isspace(c)) {
+ usehex = 1;
+ break;
+@@ -433,20 +445,31 @@ string_quote(const char *instr, char *outstr, int len, int size)
+ *s++ = '\"';
+
+ if (usehex) {
++ /* Hex-quote the whole string. */
+ for (i = 0; i < size; ++i) {
+ c = ustr[i];
+- if (len < 0 && c == '\0')
+- break;
++ /* Check for NUL-terminated string. */
++ if (len < 0) {
++ if (c == '\0')
++ break;
++ /* Quote at most size - 1 bytes. */
++ if (i == size - 1)
++ continue;
++ }
+ sprintf(s, "\\x%02x", c);
+ s += 4;
+ }
+ } else {
+ for (i = 0; i < size; ++i) {
+ c = ustr[i];
+- if (len < 0 && i == size - 2 && c != '\0')
+- ++i;
+- if (len < 0 && c == '\0')
+- break;
++ /* Check for NUL-terminated string. */
++ if (len < 0) {
++ if (c == '\0')
++ break;
++ /* Quote at most size - 1 bytes. */
++ if (i == size - 1)
++ continue;
++ }
+ switch (c) {
+ case '\"': case '\\':
+ *s++ = '\\';
+@@ -495,18 +518,25 @@ string_quote(const char *instr, char *outstr, int len, int size)
+ return i == size;
+ }
+
++/*
++ * Print path string specified by address `addr' and length `n'.
++ * If path length exceeds `n', append `...' to the output.
++ */
+ void
+ printpathn(struct tcb *tcp, long addr, int n)
+ {
+- if (n > sizeof path - 1)
+- n = sizeof path - 1;
+-
+- if (addr == 0) {
++ if (!addr) {
+ tprintf("NULL");
+ return;
+ }
+
++ /* Cap path length to the path buffer size,
++ and NUL-terminate the buffer. */
++ if (n > sizeof path - 1)
++ n = sizeof path - 1;
+ path[n] = '\0';
++
++ /* Fetch one byte more to find out whether path length > n. */
+ if (umovestr(tcp, addr, n + 1, path) < 0)
+ tprintf("%#lx", addr);
+ else {
+@@ -515,7 +545,8 @@ printpathn(struct tcb *tcp, long addr, int n)
+
+ if (trunc)
+ path[n] = '\0';
+- if (string_quote(path, outstr, -1, n + 1) || trunc)
++ (void) string_quote(path, outstr, -1, n + 1);
++ if (trunc)
+ strcat(outstr, "...");
+ tprintf("%s", outstr);
+ }
+@@ -527,6 +558,11 @@ printpath(struct tcb *tcp, long addr)
+ printpathn(tcp, addr, sizeof path - 1);
+ }
+
++/*
++ * Print string specified by address `addr' and length `len'.
++ * If `len' < 0, treat the string as a NUL-terminated string.
++ * If string length exceeds `max_strlen', append `...' to the output.
++ */
+ void
+ printstr(struct tcb *tcp, long addr, int len)
+ {
+@@ -538,32 +574,39 @@ printstr(struct tcb *tcp, long addr, int len)
+ tprintf("NULL");
+ return;
+ }
+- if (!str) {
+- if ((str = malloc(max_strlen + 1)) == NULL
+- || (outstr = malloc(4*max_strlen
+- + sizeof "\"\"...")) == NULL) {
+- fprintf(stderr, "out of memory\n");
+- tprintf("%#lx", addr);
+- return;
+- }
++ /* Allocate static buffers if they are not allocated yet. */
++ if (!str)
++ str = malloc(max_strlen + 1);
++ if (!outstr)
++ outstr = malloc(4 * max_strlen + sizeof "\"...\"");
++ if (!str || !outstr) {
++ fprintf(stderr, "out of memory\n");
++ tprintf("%#lx", addr);
++ return;
+ }
+
+ if (len < 0) {
++ /*
++ * Treat as a NUL-terminated string: fetch one byte more
++ * because string_quote() quotes one byte less.
++ */
+ size = max_strlen + 1;
++ str[max_strlen] = '\0';
+ if (umovestr(tcp, addr, size, str) < 0) {
+ tprintf("%#lx", addr);
+ return;
+ }
+ }
+ else {
+- size = MIN(len, max_strlen + 1);
++ size = MIN(len, max_strlen);
+ if (umoven(tcp, addr, size, str) < 0) {
+ tprintf("%#lx", addr);
+ return;
+ }
+ }
+
+- if (string_quote(str, outstr, len, size))
++ if (string_quote(str, outstr, len, size) &&
++ (len < 0 || len > max_strlen))
+ strcat(outstr, "...");
+
+ tprintf("%s", outstr);
+
================================================================
More information about the pld-cvs-commit
mailing list