$OpenBSD: patch-libgputils_gparchive_c,v 1.4 2004/02/14 15:09:44 avsm Exp $
--- libgputils/gparchive.c.orig	2004-01-09 08:10:37.000000000 +0000
+++ libgputils/gparchive.c	2004-02-13 20:02:41.000000000 +0000
@@ -50,7 +50,7 @@ gp_archive_member_name(gp_archive_type *
   char name[256];
   char *end;
 
-  sscanf(archive->header.ar_name, "%s/", name);
+  sscanf(archive->header.ar_name, "%255s/", name);
   end = strchr(&name[0], '/');
   if (end != NULL) 
     *end = '\0';
@@ -73,7 +73,7 @@ gp_archive_list_members(gp_archive_type 
     archive = archive->next;
 
   while (archive != NULL) {
-    sscanf(archive->header.ar_name, "%s/", name);
+    sscanf(archive->header.ar_name, "%255s/", name);
     sscanf(archive->header.ar_date, "%il", &date);
     sscanf(archive->header.ar_size, "%il", &size);
     end = strchr(&name[0], '/');
@@ -99,7 +99,7 @@ gp_archive_find_member(gp_archive_type *
     archive = archive->next;
 
   while (archive != NULL) {
-    sscanf(archive->header.ar_name, "%s/", name);
+    sscanf(archive->header.ar_name, "%255s/", name);
     end = strrchr(&name[0], '/');
     if (end != NULL) 
       *end = '\0';
@@ -183,16 +183,16 @@ gp_archive_add_member(gp_archive_type *a
 
   timer = (int)time(NULL);
   
-  sprintf(name, "%s/", objectname);
-  sprintf(date, "%il", timer);
-  sprintf(size, "%lil", newobject->size);
+  snprintf(name, sizeof(name), "%s/", objectname);
+  snprintf(date, sizeof(date), "%il", timer);
+  snprintf(size, sizeof(size), "%lil", newobject->size);
 
   /* FIXME:  These functions over right the 0x20 that the header is filled 
      with. */ 
-  strncpy(&newmember->header.ar_name[0], &name[0], 256);
-  strncpy(&newmember->header.ar_date[0], &date[0], 12);
-  strncpy(&newmember->header.ar_size[0], &size[0], 10);
-  strncpy(&newmember->header.ar_fmag[0], ARMAG, 2);
+  strlcpy(newmember->header.ar_name, &name[0], sizeof(newmember->header.ar_name));
+  strlcpy(newmember->header.ar_date, &date[0], sizeof(newmember->header.ar_date));
+  strlcpy(newmember->header.ar_size, &size[0], sizeof(newmember->header.ar_size));
+  strlcpy(newmember->header.ar_fmag, ARMAG, sizeof(newmember->header.ar_fmag));
 
   oldmember = gp_archive_find_member(archive, objectname);
   
@@ -231,9 +231,9 @@ gp_archive_extract_member(gp_archive_typ
   /* if the object doesn't have an extension, add one.  This is done for
      some libs generated with other tools.  It should not be necessary
      for libs generated by gplib. */
-  strcpy(filename, objectname);
+  strlcpy(filename, objectname, sizeof(filename));
   if (strrchr(filename, '.') == NULL)
-    strcat(filename, ".o");
+    strlcat(filename, ".o", sizeof(filename));
 
   output_file = fopen(filename, "wb");
   if (output_file == NULL) {
@@ -413,7 +413,7 @@ gp_archive_make_index(gp_archive_type *a
     archive = archive->next;
         
   while (archive != NULL) {
-    sscanf(archive->header.ar_name, "%s/", name);
+    sscanf(archive->header.ar_name, "%255s/", name);
     end = strchr(&name[0], '/');
     if (end != NULL) 
       *end = '\0';
@@ -461,17 +461,25 @@ gp_archive_add_index(struct symbol_table
 
   /* create a new member for the index and place it in the archive */
   newmember = (gp_archive_type *)malloc(sizeof(*newmember));
+  if (!newmember) {
+    err(1, NULL);
+    exit(1);
+  }
   newmember->file = (char *)malloc(sizeof(char)*indexsize);
+  if(!newmember->file) {
+    err(1, NULL);
+    exit(1);
+  }
   newmember->next = NULL;  
 
   /* fill in the archive header */
   memset(&newmember->header, 0x20, AR_HDR_SIZ); /* fill the header with space */
 
   newmember->header.ar_name[0] = '/';
-  sprintf(size, "%lil", indexsize);
+  snprintf(size, sizeof(size), "%lil", indexsize);
 
-  strncpy(&newmember->header.ar_size[0], &size[0], 10);
-  strncpy(&newmember->header.ar_fmag[0], ARMAG, 2);
+  strlcpy(newmember->header.ar_size, &size[0], sizeof(newmember->header.ar_size));
+  strlcpy(newmember->header.ar_fmag, ARMAG, sizeof(newmember->header.ar_fmag));
 
   newmember->next = archive;
   archive = newmember;
@@ -494,8 +502,10 @@ gp_archive_add_index(struct symbol_table
 
   /* write the symbol names to the member */
   for (i = 0; i < table->count; i++) {
-    strcpy(ptr, get_symbol_name(lst[i]));
-    ptr += strlen(get_symbol_name(lst[i])) + 1;
+    const char*  symbol_name = get_symbol_name(lst[i]);
+    const size_t symbol_len  = strlen(symbol_name) + 1;
+    memcpy(ptr, symbol_name, symbol_len);
+    ptr += symbol_len;
   }
   
   return archive;
@@ -602,7 +612,7 @@ gp_archive_print_table(struct symbol_tab
     member = get_symbol_annotation(lst[i]);
     assert(member != NULL);
     /* determine the archive member name */
-    sscanf(member->header.ar_name, "%s/", name);
+    sscanf(member->header.ar_name, "%255s/", name);
     end = strchr(&name[0], '/');
     if (end != NULL) 
       *end = '\0';
