]> granicus.if.org Git - procps-ng/commitdiff
fix wchan alignment problem -- snprintf can return more than written
authoralbert <>
Mon, 10 Jan 2005 21:29:53 +0000 (21:29 +0000)
committeralbert <>
Mon, 10 Jan 2005 21:29:53 +0000 (21:29 +0000)
ps/output.c

index 3d8862ae647a22462e31d28cf4818d0aa36a89a4..fe71975ceed0465b9d04a2a9d4fef5570c93fc2c 100644 (file)
@@ -648,9 +648,42 @@ static int pr_wchan(char *restrict const outbuf, const proc_t *restrict const pp
  * The output should be truncated to maximal columns width -- overflow
  * is not supported for the "wchan".
  */
-    if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, max_rightward+1, "-");
-    if(wchan_is_number) return snprintf(outbuf, max_rightward+1, "%x", (unsigned)(pp->wchan) & 0xffffffu);
-    return snprintf(outbuf, max_rightward+1, "%s", lookup_wchan(pp->wchan, pp->XXXID));
+  const char *w;
+  size_t len;
+  if(!(pp->wchan & 0xffffff)) return memcpy(outbuf,"-",2),1;
+  if(wchan_is_number) return snprintf(outbuf, COLWID, "%x", (unsigned)(pp->wchan) & 0xffffffu);
+  w = lookup_wchan(pp->wchan, pp->XXXID);
+  len = strlen(w);
+  if(len>max_rightward) len=max_rightward;
+  memcpy(outbuf, w, len);
+  outbuf[len] = '\0';
+  return len;
+}
+
+static int pr_wname(char *restrict const outbuf, const proc_t *restrict const pp){
+/* SGI's IRIX always uses a number for "wchan", so "wname" is provided too.
+ *
+ * We use '-' for running processes, the location when there is
+ * only one thread waiting in the kernel, and '*' when there is
+ * more than one thread waiting in the kernel.
+ *
+ * The output should be truncated to maximal columns width -- overflow
+ * is not supported for the "wchan".
+ */
+  const char *w;
+  size_t len;
+  if(!(pp->wchan & 0xffffff)) return memcpy(outbuf,"-",2),1;
+  w = lookup_wchan(pp->wchan, pp->XXXID);
+  len = strlen(w);
+  if(len>max_rightward) len=max_rightward;
+  memcpy(outbuf, w, len);
+  outbuf[len] = '\0';
+  return len;
+}
+
+static int pr_nwchan(char *restrict const outbuf, const proc_t *restrict const pp){
+  if(!(pp->wchan & 0xffffff)) return memcpy(outbuf,"-",2),1;
+  return snprintf(outbuf, COLWID, "%x", (unsigned)(pp->wchan) & 0xffffffu);
 }
 
 /* Terrible trunctuation, like BSD crap uses: I999 J999 K999 */
@@ -856,25 +889,6 @@ static int pr_psr(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%d", pp->processor);
 }
 
-static int pr_wname(char *restrict const outbuf, const proc_t *restrict const pp){
-/* SGI's IRIX always uses a number for "wchan", so "wname" is provided too.
- *
- * We use '-' for running processes, the location when there is
- * only one thread waiting in the kernel, and '*' when there is
- * more than one thread waiting in the kernel.
- *
- * The output should be truncated to maximal columns width -- overflow
- * is not supported for the "wchan".
- */
-    if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, max_rightward+1, "-");
-    return snprintf(outbuf, max_rightward+1, "%s", lookup_wchan(pp->wchan, pp->XXXID));
-}
-
-static int pr_nwchan(char *restrict const outbuf, const proc_t *restrict const pp){
-    if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, max_rightward+1, "-");
-    return snprintf(outbuf, max_rightward+1, "%x", (unsigned)(pp->wchan) & 0xffffffu);
-}
-
 static int pr_rss(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%lu", pp->vm_rss);
 }