Another nice cleanup from Larry. This adds a new last_char_is() function and
authorEric Andersen <andersen@codepoet.org>
Thu, 26 Apr 2001 15:56:47 +0000 (15:56 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 26 Apr 2001 15:56:47 +0000 (15:56 -0000)
uses it to avoid possible buffer underruns whn strlen is zero, and avoid the
possible space-hogging inline of strlen() in several cases.
 -Erik

12 files changed:
Makefile
archival/dpkg.c
archival/tar.c
coreutils/cut.c
cut.c
dpkg.c
editors/vi.c
include/libbb.h
libbb/last_char_is.c [new file with mode: 0644]
libbb/libbb.h
tar.c
vi.c

index 11cec64b1a679d8344e859c7b135872e04dfb2da..dcf6bd6410d7a00c56a1d4bcb27aa74954452c1f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -248,7 +248,7 @@ process_escape_sequence.c read_package_field.c read_text_file_to_buffer.c \
 recursive_action.c safe_read.c safe_strncpy.c seek_ared_file.c syscalls.c \
 syslog_msg_with_name.c time_string.c trim.c untar.c unzip.c vdprintf.c \
 verror_msg.c vperror_msg.c wfopen.c xfuncs.c xgetcwd.c xregcomp.c interface.c \
-remove_file.c
+remove_file.c last_char_is.c
 LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC))
 LIBBB_CFLAGS = -I$(LIBBB)
 ifneq ($(strip $(BB_SRC_DIR)),)
index e5ed95cb86c1ce1d18e87bdfbf53819f8156f8e8..996809a6ffa9e44a6327fb5b80fd4fe56bbc9c07 100644 (file)
@@ -583,7 +583,7 @@ static int status_merge(void *status, package_t *pkgs)
         */
        if ((fin = fopen(statusfile, "r")) != NULL) {
                while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) { 
-                       line[strlen(line) - 1] = '\0'; /* trim newline */
+                       chomp(line); /* trim newline */
                        /* If we see a package header, find out if it's a package
                         * that we have processed. if so, we skip that block for
                         * now (write it at the end).
index 48284c00abf87f3a28b4edcfb3701158a9e823af..716f4ac3071c5fb8cf349212c3e59df39c050de6 100644 (file)
@@ -706,7 +706,7 @@ static int readTarFile(int tarFd, int extractFlag, int listFlag,
                        case REGTYPE0:
                                /* If the name ends in a '/' then assume it is
                                 * supposed to be a directory, and fall through */
-                               if (header.name[strlen(header.name)-1] != '/') {
+                               if (last_char_is(header.name,'/')) {
                                        if (tarExtractRegularFile(&header, extractFlag, tostdoutFlag)==FALSE)
                                                errorFlag=TRUE;
                                        break;
index 7e9a72e3f7ba67eeef659bf544b5afe6f624f4a8..d852ab3be957a9230e07f6b43bb0b5f2bae26789 100644 (file)
@@ -75,7 +75,7 @@ static void decompose_list(const char *list)
        /* handle multi-value cases */
        else if (nminus == 1) {
                /* handle 'N-' case */
-               if (list[strlen(list) - 1] == '-') {
+               if (last_char_is(list,'-')) {
                        startpos = strtol(list, &ptr, 10);
                }
                /* handle '-M' case */
diff --git a/cut.c b/cut.c
index 7e9a72e3f7ba67eeef659bf544b5afe6f624f4a8..d852ab3be957a9230e07f6b43bb0b5f2bae26789 100644 (file)
--- a/cut.c
+++ b/cut.c
@@ -75,7 +75,7 @@ static void decompose_list(const char *list)
        /* handle multi-value cases */
        else if (nminus == 1) {
                /* handle 'N-' case */
-               if (list[strlen(list) - 1] == '-') {
+               if (last_char_is(list,'-')) {
                        startpos = strtol(list, &ptr, 10);
                }
                /* handle '-M' case */
diff --git a/dpkg.c b/dpkg.c
index e5ed95cb86c1ce1d18e87bdfbf53819f8156f8e8..996809a6ffa9e44a6327fb5b80fd4fe56bbc9c07 100644 (file)
--- a/dpkg.c
+++ b/dpkg.c
@@ -583,7 +583,7 @@ static int status_merge(void *status, package_t *pkgs)
         */
        if ((fin = fopen(statusfile, "r")) != NULL) {
                while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) { 
-                       line[strlen(line) - 1] = '\0'; /* trim newline */
+                       chomp(line); /* trim newline */
                        /* If we see a package header, find out if it's a package
                         * that we have processed. if so, we skip that block for
                         * now (write it at the end).
index 6a93fc1feccc89f2566e378fe70bfb6fc6cfa792..96fc96559e197e7ea4931d09861c700c6639ba7a 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 char *vi_Version =
-       "$Id: vi.c,v 1.4 2001/04/16 15:46:44 andersen Exp $";
+       "$Id: vi.c,v 1.5 2001/04/26 15:56:47 andersen Exp $";
 
 /*
  * To compile for standalone use:
@@ -1745,7 +1745,7 @@ static void colon(Byte * buf)
        while (isblnk(*buf))
                buf++;
        strcpy((char *) args, (char *) buf);
-       if (cmd[strlen((char *) cmd) - 1] == '!') {
+       if (last_char_is((char *)cmd,'!')) {
                useforce = TRUE;
                cmd[strlen((char *) cmd) - 1] = '\0';   // get rid of !
        }
index 2937b486324302eff5b92b59056c69a1ff05b5f8..0ceb983cd10420450c9b027ec72dc5482330c9ff 100644 (file)
@@ -218,6 +218,7 @@ int klogctl(int type, char * b, int len);
 
 char *xgetcwd(char *cwd);
 char *concat_path_file(const char *path, const char *filename);
+int last_char_is(const char *s, const int c);
 
 typedef struct ar_headers_s {
        char *name;
diff --git a/libbb/last_char_is.c b/libbb/last_char_is.c
new file mode 100644 (file)
index 0000000..b4bb7ec
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * busybox library eXtended function
+ *
+ * Copyright (C) 2001 Larry Doolittle, <ldoolitt@recycle.lbl.gov>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "libbb.h"
+
+/* Find out if the last character of a string matches the one given Don't
+ * underrun the buffer if the string length is 0.  Also avoids a possible
+ * space-hogging inline of strlen() per usage.
+ */
+int last_char_is(const char *s, const int c)
+{
+       int  l = strlen(s);
+       if (l==0) return 0;
+       return (s[l-1] == c);
+}
index 2937b486324302eff5b92b59056c69a1ff05b5f8..0ceb983cd10420450c9b027ec72dc5482330c9ff 100644 (file)
@@ -218,6 +218,7 @@ int klogctl(int type, char * b, int len);
 
 char *xgetcwd(char *cwd);
 char *concat_path_file(const char *path, const char *filename);
+int last_char_is(const char *s, const int c);
 
 typedef struct ar_headers_s {
        char *name;
diff --git a/tar.c b/tar.c
index 48284c00abf87f3a28b4edcfb3701158a9e823af..716f4ac3071c5fb8cf349212c3e59df39c050de6 100644 (file)
--- a/tar.c
+++ b/tar.c
@@ -706,7 +706,7 @@ static int readTarFile(int tarFd, int extractFlag, int listFlag,
                        case REGTYPE0:
                                /* If the name ends in a '/' then assume it is
                                 * supposed to be a directory, and fall through */
-                               if (header.name[strlen(header.name)-1] != '/') {
+                               if (last_char_is(header.name,'/')) {
                                        if (tarExtractRegularFile(&header, extractFlag, tostdoutFlag)==FALSE)
                                                errorFlag=TRUE;
                                        break;
diff --git a/vi.c b/vi.c
index 6a93fc1feccc89f2566e378fe70bfb6fc6cfa792..96fc96559e197e7ea4931d09861c700c6639ba7a 100644 (file)
--- a/vi.c
+++ b/vi.c
@@ -19,7 +19,7 @@
  */
 
 char *vi_Version =
-       "$Id: vi.c,v 1.4 2001/04/16 15:46:44 andersen Exp $";
+       "$Id: vi.c,v 1.5 2001/04/26 15:56:47 andersen Exp $";
 
 /*
  * To compile for standalone use:
@@ -1745,7 +1745,7 @@ static void colon(Byte * buf)
        while (isblnk(*buf))
                buf++;
        strcpy((char *) args, (char *) buf);
-       if (cmd[strlen((char *) cmd) - 1] == '!') {
+       if (last_char_is((char *)cmd,'!')) {
                useforce = TRUE;
                cmd[strlen((char *) cmd) - 1] = '\0';   // get rid of !
        }