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/