From b8efe48651b88dd4db89d924ad6d3bc8e08f84af Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Mon, 10 Jun 2013 11:49:29 -0400 Subject: [PATCH] PR15044: keep cute return val and conditional check for last_error only In order to avoid the kernel panic which occurred due to a null pointer (see previous commit), all patches in PR15044 were rechecked so that the return value is always valid (by keeping its cute message) and the conditional version check is done solely for assigning to last_error. --- runtime/stp_string.c | 10 +--------- tapset/string.stp | 3 +-- tapset/uconversions.stp | 7 +++---- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/runtime/stp_string.c b/runtime/stp_string.c index 875f7961f..a7392782e 100644 --- a/runtime/stp_string.c +++ b/runtime/stp_string.c @@ -77,11 +77,7 @@ static int _stp_text_str(char *outstr, char *in, int len, int quoted, int user) if (user) { if (_stp_read_address(c, in, USER_DS)) -#if STAP_COMPAT_VERSION < STAP_VERSION(2,3) // PR15044 goto bad; -#else - return -1; -#endif } else c = *in; @@ -151,11 +147,7 @@ static int _stp_text_str(char *outstr, char *in, int len, int quoted, int user) in++; if (user) { if (_stp_read_address(c, in, USER_DS)) -#if STAP_COMPAT_VERSION < STAP_VERSION(2,3) // PR15044 goto bad; -#else - return -1; -#endif } else c = *in; } @@ -174,7 +166,7 @@ static int _stp_text_str(char *outstr, char *in, int len, int quoted, int user) return 0; bad: strlcpy (outstr, "", len); - return -1; + return -1; // PR15044 } /** diff --git a/tapset/string.stp b/tapset/string.stp index b67485e31..030fa95ef 100644 --- a/tapset/string.stp +++ b/tapset/string.stp @@ -50,9 +50,8 @@ function stringat:long(str:string, pos:long) %{ /* pure */ /* unprivileged */ if (STAP_ARG_pos >= 0 && STAP_ARG_pos < strlen(STAP_ARG_str)) STAP_RETVALUE = STAP_ARG_str[STAP_ARG_pos]; else { -#if STAP_COMPAT_VERSION < STAP_VERSION(2,3) // PR15044 STAP_RETVALUE = 0; -#else +#if STAP_COMPAT_VERSION >= STAP_VERSION(2,3) // PR15044 CONTEXT->last_error = "Position out of bounds"; #endif } diff --git a/tapset/uconversions.stp b/tapset/uconversions.stp index d3593256c..3e418faee 100644 --- a/tapset/uconversions.stp +++ b/tapset/uconversions.stp @@ -159,16 +159,15 @@ function user_string_n:string (addr:long, n:long) int64_t len = clamp_t(int64_t, STAP_ARG_n + 1, 1, MAXSTRINGLEN); rc = _stp_strncpy_from_user(STAP_RETVALUE, (char __user *) (uintptr_t) STAP_ARG_addr, len); - if (rc < 0) -#if STAP_COMPAT_VERSION < STAP_VERSION(2,3) // PR15044 + if (rc < 0) { strlcpy(STAP_RETVALUE, "", MAXSTRINGLEN); -#else +#if STAP_COMPAT_VERSION >= STAP_VERSION(2,3) // PR15044 snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), "user string copy fault %ld at %p", rc, (void *) (uintptr_t) STAP_ARG_addr); CONTEXT->last_error = CONTEXT->error_buffer; #endif - else + } else STAP_RETVALUE[len - 1] = '\0'; %} -- 2.43.5