[前][次][番号順一覧][スレッド一覧]

ruby-changes:45116

From: nobu <ko1@a...>
Date: Mon, 26 Dec 2016 18:28:53 +0900 (JST)
Subject: [ruby-changes:45116] nobu:r57189 (trunk): get rid of strcpy

nobu	2016-12-26 18:28:46 +0900 (Mon, 26 Dec 2016)

  New Revision: 57189

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57189

  Log:
    get rid of strcpy
    
    * addr2line.c (follow_debuglink): insert global_debug_dir by using
      memmove instead of copying to temporary buffer.
    
    * dln.c (dln_load): use memcpy with the known length instead of
      strcpy.
    
    * gc.c (rb_gc_unprotect_logging): use strdup instead of malloc and
      strcpy.

  Modified files:
    trunk/addr2line.c
    trunk/dln.c
    trunk/gc.c
Index: gc.c
===================================================================
--- gc.c	(revision 57188)
+++ gc.c	(revision 57189)
@@ -6003,9 +6003,8 @@ rb_gc_unprotect_logging(void *objptr, co https://github.com/ruby/ruby/blob/trunk/gc.c#L6003
 	    cnt++;
 	}
 	else {
-	    ptr = (char *)malloc(strlen(buff) + 1);
+	    ptr = (strdup)(buff);
 	    if (!ptr) rb_memerror();
-	    strcpy(ptr, buff);
 	}
 	st_insert(rgengc_unprotect_logging_table, (st_data_t)ptr, cnt);
     }
Index: addr2line.c
===================================================================
--- addr2line.c	(revision 57188)
+++ addr2line.c	(revision 57189)
@@ -427,22 +427,25 @@ fill_lines(int num_traces, void **traces https://github.com/ruby/ruby/blob/trunk/addr2line.c#L427
 	   obj_info_t **objp, line_info_t *lines, int offset);
 
 static void
-append_obj(obj_info_t **objp) {
+append_obj(obj_info_t **objp)
+{
     obj_info_t *newobj = calloc(1, sizeof(obj_info_t));
     if (*objp) (*objp)->next = newobj;
     *objp = newobj;
 }
 
 static void
-follow_debuglink(char *debuglink, int num_traces, void **traces,
+follow_debuglink(const char *debuglink, int num_traces, void **traces,
 		 obj_info_t **objp, line_info_t *lines, int offset)
 {
     /* Ideally we should check 4 paths to follow gnu_debuglink,
        but we handle only one case for now as this format is used
        by some linux distributions. See GDB's info for detail. */
     static const char global_debug_dir[] = "/usr/lib/debug";
-    char *p, *subdir;
+    const size_t global_debug_dir_len = sizeof(global_debug_dir) - 1;
+    char *p;
     obj_info_t *o1 = *objp, *o2;
+    size_t len;
 
     p = strrchr(binary_filename, '/');
     if (!p) {
@@ -450,11 +453,13 @@ follow_debuglink(char *debuglink, int nu https://github.com/ruby/ruby/blob/trunk/addr2line.c#L453
     }
     p[1] = '\0';
 
-    subdir = (char *)alloca(strlen(binary_filename) + 1);
-    strcpy(subdir, binary_filename);
-    strcpy(binary_filename, global_debug_dir);
-    strlcat(binary_filename, subdir, PATH_MAX);
-    strlcat(binary_filename, debuglink, PATH_MAX);
+    len = strlen(binary_filename);
+    if (len >= PATH_MAX - global_debug_dir_len)
+	len = PATH_MAX - global_debug_dir_len - 1;
+    memmove(binary_filename + global_debug_dir_len, binary_filename, len);
+    memcpy(binary_filename, global_debug_dir, global_debug_dir_len);
+    len += global_debug_dir_len;
+    strlcpy(binary_filename + len, debuglink, PATH_MAX - len);
 
     append_obj(objp);
     o2 = *objp;
@@ -726,7 +731,7 @@ rb_dump_backtrace_with_lines(int num_tra https://github.com/ruby/ruby/blob/trunk/addr2line.c#L731
 	    path = info.dli_fname;
 	    obj->path = path;
 	    lines[i].path = path;
-	    strcpy(binary_filename, path);
+	    strlcpy(binary_filename, path, PATH_MAX);
 	    if (fill_lines(num_traces, traces, 1, &obj, lines, i) == (uintptr_t)-1)
 		break;
 	}
Index: dln.c
===================================================================
--- dln.c	(revision 57188)
+++ dln.c	(revision 57189)
@@ -1250,7 +1250,6 @@ dln_load(const char *file) https://github.com/ruby/ruby/blob/trunk/dln.c#L1250
 #endif
 #if !defined(_AIX) && !defined(NeXT)
     const char *error = 0;
-#define DLN_ERROR() (error = dln_strerror(), strcpy(ALLOCA_N(char, strlen(error) + 1), error))
 #endif
 
 #if defined _WIN32
@@ -1349,7 +1348,8 @@ dln_load(const char *file) https://github.com/ruby/ruby/blob/trunk/dln.c#L1348
 
 	init_fct = (void(*)())(VALUE)dlsym(handle, buf);
 	if (init_fct == NULL) {
-	    error = DLN_ERROR();
+	    const size_t errlen = strlen(error = dln_strerror()) + 1;
+	    error = memcpy(ALLOCA_N(char, errlen), error, errlen);
 	    dlclose(handle);
 	    goto failed;
 	}

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]