summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2003-06-19 22:40:46 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2003-06-19 22:40:46 +0000
commited6c30da916c88715f1bd5bb82ccedd39259d498 (patch)
treee1ed14c8b400f3818fee607896f1c049ef07fbb8
parentc1ca9fed73a101965a2fcad946591e6949f7f162 (diff)
o get rid of strecpy() and use strlcpy() and/or snprintf() instead.
o make itoa() just use snprintf() o rename itoa7() to format_uid() and use snprintf() o max username len is _PW_NAME_LEN, not 8
-rw-r--r--usr.bin/top/display.c74
-rw-r--r--usr.bin/top/top.c4
-rw-r--r--usr.bin/top/username.c14
-rw-r--r--usr.bin/top/utils.c69
-rw-r--r--usr.bin/top/utils.h5
5 files changed, 74 insertions, 92 deletions
diff --git a/usr.bin/top/display.c b/usr.bin/top/display.c
index e8ed5fd24a8..ef8bb8e00d6 100644
--- a/usr.bin/top/display.c
+++ b/usr.bin/top/display.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: display.c,v 1.15 2003/06/18 08:36:31 deraadt Exp $ */
+/* $OpenBSD: display.c,v 1.16 2003/06/19 22:40:45 millert Exp $ */
/*
* Top users/processes display for Unix
@@ -75,7 +75,7 @@ static int display_width = MAX_COLS;
static char *cpustates_tag(void);
static int string_count(char **);
-static void summary_format(char *, int *, char **);
+static void summary_format(char *, size_t, int *, char **);
static void line_update(char *, char *, int, int);
#define lineindex(l) ((l)*display_width)
@@ -277,7 +277,8 @@ i_procstates(int total, int *brkdn)
}
/* format and print the process state summary */
- summary_format(procstates_buffer, brkdn, procstate_names);
+ summary_format(procstates_buffer, sizeof(procstates_buffer), brkdn,
+ procstate_names);
if (fputs(procstates_buffer, stdout) == EOF)
exit(1);
@@ -320,7 +321,7 @@ u_procstates(int total, int *brkdn)
/* see if any of the state numbers has changed */
if (memcmp(lprocstates, brkdn, num_procstates * sizeof(int)) != 0) {
/* format and update the line */
- summary_format(new, brkdn, procstate_names);
+ summary_format(new, sizeof(new), brkdn, procstate_names);
line_update(procstates_buffer, new, x_brkdn, y_brkdn);
memcpy(lprocstates, brkdn, num_procstates * sizeof(int));
}
@@ -461,7 +462,8 @@ i_memory(int *stats)
lastline++;
/* format and print the memory summary */
- summary_format(memory_buffer, stats, memory_names);
+ summary_format(memory_buffer, sizeof(memory_buffer), stats,
+ memory_names);
if (fputs(memory_buffer, stdout) == EOF)
exit(1);
}
@@ -472,7 +474,7 @@ u_memory(int *stats)
static char new[MAX_COLS];
/* format the new line */
- summary_format(new, stats, memory_names);
+ summary_format(new, sizeof(new), stats, memory_names);
line_update(memory_buffer, new, x_mem, y_mem);
}
@@ -566,7 +568,8 @@ u_header(char *text)
void
i_process(int line, char *thisline)
{
- char *p, *base;
+ char *base;
+ size_t len;
/* make sure we are on the correct line */
while (lastline < y_procs + line) {
@@ -584,17 +587,19 @@ i_process(int line, char *thisline)
/* copy it in to our buffer */
base = smart_terminal ? screenbuf + lineindex(line) : screenbuf;
- p = strecpy(base, thisline);
-
- /* zero fill the rest of it */
- memset(p, 0, display_width - (p - base));
+ len = strlcpy(base, thisline, display_width);
+ if (len < (size_t)display_width) {
+ /* zero fill the rest of it */
+ memset(base + len, 0, display_width - len);
+ }
}
void
u_process(int linenum, char *linebuf)
{
int screen_line = linenum + Header_lines;
- char *optr, *bufferline;
+ char *bufferline;
+ size_t len;
/* remember a pointer to the current line in the screen buffer */
bufferline = &screenbuf[lineindex(linenum)];
@@ -620,10 +625,11 @@ u_process(int linenum, char *linebuf)
exit(1);
/* copy it in to the buffer */
- optr = strecpy(bufferline, linebuf);
-
- /* zero fill the rest of it */
- memset(optr, 0, display_width - (optr - bufferline));
+ len = strlcpy(bufferline, linebuf, display_width);
+ if (len < (size_t)display_width) {
+ /* zero fill the rest of it */
+ memset(bufferline + len, 0, display_width - len);
+ }
} else {
line_update(bufferline, linebuf, 0, linenum + Header_lines);
}
@@ -826,14 +832,24 @@ string_count(char **pp)
return (cnt);
}
+#define COPYLEFT(to, from) \
+ do { \
+ len = strlcpy((to), (from), left); \
+ if (len >= left) \
+ return; \
+ p += len; \
+ left -= len; \
+ } while (0)
+
static void
-summary_format(char *str, int *numbers, char **names)
+summary_format(char *buf, size_t left, int *numbers, char **names)
{
char *p, *thisname;
+ size_t len;
int num;
/* format each number followed by its string */
- p = str;
+ p = buf;
while ((thisname = *names++) != NULL) {
/* get the number to format */
num = *numbers++;
@@ -842,26 +858,32 @@ summary_format(char *str, int *numbers, char **names)
/* is this number in kilobytes? */
if (thisname[0] == 'K') {
/* yes: format it as a memory value */
- p = strecpy(p, format_k(num));
+ COPYLEFT(p, format_k(num));
/*
* skip over the K, since it was included by
* format_k
*/
- p = strecpy(p, thisname + 1);
+ COPYLEFT(p, thisname + 1);
} else if (num > 0) {
- p = strecpy(p, itoa(num));
- p = strecpy(p, thisname);
+ len = snprintf(p, left, "%d%s", num, thisname);
+ if (len == (size_t)-1 || len >= left)
+ return;
+ p += len;
+ left -= len;
}
+ } else {
+ /*
+ * Ignore negative numbers, but display corresponding
+ * string.
+ */
+ COPYLEFT(p, thisname);
}
- /* ignore negative numbers, but display corresponding string */
- else
- p = strecpy(p, thisname);
}
/* if the last two characters in the string are ", ", delete them */
p -= 2;
- if (p >= str && p[0] == ',' && p[1] == ' ')
+ if (p >= buf && p[0] == ',' && p[1] == ' ')
*p = '\0';
}
diff --git a/usr.bin/top/top.c b/usr.bin/top/top.c
index b30f0e5d404..9472a5567bd 100644
--- a/usr.bin/top/top.c
+++ b/usr.bin/top/top.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: top.c,v 1.25 2003/06/18 08:42:17 deraadt Exp $ */
+/* $OpenBSD: top.c,v 1.26 2003/06/19 22:40:45 millert Exp $ */
/*
* Top users/processes display for Unix
@@ -280,7 +280,7 @@ main(int argc, char *argv[])
/* set constants for username/uid display correctly */
if (!do_unames) {
uname_field = " UID ";
- get_userid = itoa7;
+ get_userid = format_uid;
}
/* initialize the kernel memory interface */
if (machine_init(&statics) == -1)
diff --git a/usr.bin/top/username.c b/usr.bin/top/username.c
index 42cdd37c780..ff99c932e57 100644
--- a/usr.bin/top/username.c
+++ b/usr.bin/top/username.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: username.c,v 1.11 2003/06/15 16:24:44 millert Exp $ */
+/* $OpenBSD: username.c,v 1.12 2003/06/19 22:40:45 millert Exp $ */
/*
* Top users/processes display for Unix
@@ -57,7 +57,7 @@
struct hash_el {
uid_t uid;
- char name[9];
+ char name[_PW_NAME_LEN + 1];
};
static int enter_user(uid_t, char *, int);
@@ -65,15 +65,11 @@ static int get_user(uid_t);
#define is_empty_hash(x) (hash_table[x].name[0] == 0)
-/* simple minded hashing function */
/*
- * Uid "nobody" is -2 results in hashit(-2) = -2 which is out of bounds for
- * the hash_table. Applied abs() function to fix. 2/16/96 tpugh
+ * Simple minded hashing function, assumes i is unsigned.
*/
-#define hashit(i) (abs(i) % Table_size)
+#define hashit(i) (i % Table_size)
-/* K&R requires that statically declared tables be initialized to zero. */
-/* We depend on that for hash_table and YOUR compiler had BETTER do it! */
struct hash_el hash_table[Table_size];
char *
@@ -177,5 +173,5 @@ get_user(uid_t uid)
}
#endif
/* if we can't find the name at all, then use the uid as the name */
- return (enter_user(uid, itoa7(uid), 1));
+ return (enter_user(uid, format_uid(uid), 1));
}
diff --git a/usr.bin/top/utils.c b/usr.bin/top/utils.c
index 8d22390cf8d..d0a36b4db81 100644
--- a/usr.bin/top/utils.c
+++ b/usr.bin/top/utils.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: utils.c,v 1.10 2003/06/12 23:09:30 deraadt Exp $ */
+/* $OpenBSD: utils.c,v 1.11 2003/06/19 22:40:45 millert Exp $ */
/*
* Top users/processes display for Unix
@@ -60,57 +60,36 @@ atoiwi(char *str)
}
/*
- * itoa - convert integer (decimal) to ascii string for positive numbers
- * only (we don't bother with negative numbers since we know we
- * don't use them).
+ * itoa - convert integer (decimal) to ascii string.
*/
char *
itoa(int val)
{
static char buffer[16]; /* result is built here */
- char *ptr;
/*
* 16 is sufficient since the largest number we will ever convert
* will be 2^32-1, which is 10 digits.
*/
- ptr = buffer + sizeof(buffer);
- *--ptr = '\0';
- if (val == 0) {
- *--ptr = '0';
- } else {
- while (val != 0) {
- *--ptr = (val % 10) + '0';
- val /= 10;
- }
- }
- return (ptr);
+ (void)snprintf(buffer, sizeof(buffer), "%d", val);
+ return (buffer);
}
/*
- * itoa7(val) - like itoa, except the number is right justified in a 7
- * character field. This code is a duplication of itoa instead of
- * a front end to a more general routine for efficiency.
+ * format_uid(uid) - like itoa, except for uid_t and the number is right
+ * justified in a 6 character field to match uname_field in top.c.
*/
char *
-itoa7(int val)
+format_uid(uid_t uid)
{
- static char buffer[25]; /* result is built here */
- char *ptr;
+ static char buffer[16]; /* result is built here */
- ptr = buffer + sizeof(buffer);
- *--ptr = '\0';
- if (val == 0) {
- *--ptr = '0';
- } else {
- while (val != 0) {
- *--ptr = (val % 10) + '0';
- val /= 10;
- }
- }
- while (ptr > buffer + sizeof(buffer) - 7)
- *--ptr = ' ';
- return (ptr);
+ /*
+ * 16 is sufficient since the largest uid we will ever convert
+ * will be 2^32-1, which is 10 digits.
+ */
+ (void)snprintf(buffer, sizeof(buffer), "%6u", uid);
+ return (buffer);
}
/*
@@ -130,18 +109,6 @@ digits(int val)
}
/*
- * strecpy(to, from) - copy string "from" into "to" and return a pointer
- * to the END of the string "to".
- */
-char *
-strecpy(char *to, char *from)
-{
- while ((*to++ = *from++) != '\0')
- ;
- return (--to);
-}
-
-/*
* string_index(string, array) - find string in array and return index
*/
int
@@ -344,9 +311,9 @@ format_k(int amt)
{
static char retarray[NUM_STRINGS][16];
static int index = 0;
- char *p, *ret, tag = 'K';
+ char *ret, tag = 'K';
- p = ret = retarray[index];
+ ret = retarray[index];
index = (index + 1) % NUM_STRINGS;
if (amt >= 10000) {
@@ -357,8 +324,6 @@ format_k(int amt)
tag = 'G';
}
}
- p = strecpy(p, itoa(amt));
- *p++ = tag;
- *p = '\0';
+ snprintf(ret, sizeof(retarray[0]), "%d%c", amt, tag);
return (ret);
}
diff --git a/usr.bin/top/utils.h b/usr.bin/top/utils.h
index eada1f3149a..5c411f47267 100644
--- a/usr.bin/top/utils.h
+++ b/usr.bin/top/utils.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: utils.h,v 1.5 2002/07/15 17:20:36 deraadt Exp $ */
+/* $OpenBSD: utils.h,v 1.6 2003/06/19 22:40:45 millert Exp $ */
/*
* Top users/processes display for Unix
@@ -32,9 +32,8 @@
int atoiwi(char *);
char *itoa(int);
-char *itoa7(int);
+char *format_uid(uid_t);
int digits(int);
-char *strecpy(char *, char *);
int string_index(char *, char **);
char **argparse(char *, int *);
int percentages(int, int *, long *, long *, long *);