Bläddra i källkod

ogsflib: avoid using statically allocated buffer for filenames (NAME_SIZ)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@32202 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 17 år sedan
förälder
incheckning
ca95e3f830
7 ändrade filer med 30 tillägg och 20 borttagningar
  1. 4 5
      include/gstypes.h
  2. 4 4
      lib/ogsf/GP2.c
  3. 4 4
      lib/ogsf/GV2.c
  4. 3 0
      lib/ogsf/gp.c
  5. 5 4
      lib/ogsf/gsds.c
  6. 4 0
      lib/ogsf/gv.c
  7. 6 3
      lib/ogsf/gvl_file.c

+ 4 - 5
include/gstypes.h

@@ -66,7 +66,6 @@
 #define CF_USR_CHANGED 0x000010
 #define CF_USR_CHANGED 0x000010
 #define CF_CHARSCALED  0x000100
 #define CF_CHARSCALED  0x000100
 
 
-#define NAME_SIZ 80
 #define MAX_TF 6
 #define MAX_TF 6
 
 
 #define MASK_TL 0x10000000
 #define MASK_TL 0x10000000
@@ -113,7 +112,7 @@ typedef struct{
     int dims[MAXDIMS];
     int dims[MAXDIMS];
     int ndims;
     int ndims;
     int numbytes;
     int numbytes;
-    char unique_name[NAME_SIZ];
+    char *unique_name;
     typbuff databuff;
     typbuff databuff;
     IFLAG changed;
     IFLAG changed;
     int need_reload;
     int need_reload;
@@ -173,7 +172,7 @@ typedef struct g_vect{
     int flat_val;
     int flat_val;
     int n_surfs;
     int n_surfs;
     int color, width;
     int color, width;
-    char filename[NAME_SIZ];
+    char *filename;
     float x_trans, y_trans, z_trans;
     float x_trans, y_trans, z_trans;
 /* also maybe center & rotate? */
 /* also maybe center & rotate? */
     geoline *lines;
     geoline *lines;
@@ -224,7 +223,7 @@ typedef struct g_site{
 /* ACS_MODIFY OneLine site_attr ************************************************/
 /* ACS_MODIFY OneLine site_attr ************************************************/
     int use_attr[GPT_MAX_ATTR]; /* ST_ATT_COLOR, ST_ATT_MARKER, ST_ATT_SIZE, ST_ATT_NONE, for multiple attr's */
     int use_attr[GPT_MAX_ATTR]; /* ST_ATT_COLOR, ST_ATT_MARKER, ST_ATT_SIZE, ST_ATT_NONE, for multiple attr's */
 
 
-    char filename[NAME_SIZ];
+    char *filename;
     transform attr_trans;
     transform attr_trans;
     float size;
     float size;
     float x_trans, y_trans, z_trans;
     float x_trans, y_trans, z_trans;
@@ -239,7 +238,7 @@ typedef struct
     int data_id; /* id */
     int data_id; /* id */
     IFLAG file_type; /* file type */
     IFLAG file_type; /* file type */
     unsigned int count; /* number of referencies to this file */
     unsigned int count; /* number of referencies to this file */
-    char file_name[NAME_SIZ]; /* file name */
+    char *file_name; /* file name */
 
 
     IFLAG data_type;
     IFLAG data_type;
     void *map; /* pointer to volume file descriptor */
     void *map; /* pointer to volume file descriptor */

+ 4 - 4
lib/ogsf/GP2.c

@@ -182,9 +182,7 @@ int GP_load_site(int id, const char *filename)
 	gp_free_sitemem(gp);
 	gp_free_sitemem(gp);
     }
     }
 
 
-    if (NAME_SIZ > strlen(filename)) {
-	strcpy(gp->filename, filename);
-    }
+    gp->filename = G_store(filename);
 
 
     gp->points = Gp_load_sites(filename, &(gp->n_sites),
     gp->points = Gp_load_sites(filename, &(gp->n_sites),
 			       &(gp->has_z), &(gp->has_att));
 			       &(gp->has_z), &(gp->has_att));
@@ -199,6 +197,8 @@ int GP_load_site(int id, const char *filename)
 /*!
 /*!
   \brief Get point set filename
   \brief Get point set filename
 
 
+  Note: char array is allocated by G_store()
+
   \param id point set id
   \param id point set id
   \param[out] filename point set filename
   \param[out] filename point set filename
 
 
@@ -213,7 +213,7 @@ int GP_get_sitename(int id, char *filename)
 	return (-1);
 	return (-1);
     }
     }
 
 
-    strcpy(filename, gp->filename);
+    filename = G_store(gp->filename);
 
 
     return (1);
     return (1);
 }
 }

+ 4 - 4
lib/ogsf/GV2.c

@@ -183,9 +183,7 @@ int GV_load_vector(int id, const char *filename)
 	gv_free_vectmem(gv);
 	gv_free_vectmem(gv);
     }
     }
 
 
-    if (NAME_SIZ > strlen(filename)) {
-	strcpy(gv->filename, filename);
-    }
+    gv->filename = G_store(filename);
 
 
     if ((gv->lines = Gv_load_vect(filename, &(gv->n_lines)))) {
     if ((gv->lines = Gv_load_vect(filename, &(gv->n_lines)))) {
 	return (1);
 	return (1);
@@ -197,6 +195,8 @@ int GV_load_vector(int id, const char *filename)
 /*!
 /*!
   \brief Get vector map name
   \brief Get vector map name
 
 
+  Note: char array is allocated by G_store()
+
   \param id vector set id
   \param id vector set id
   \param filename filename
   \param filename filename
 
 
@@ -211,7 +211,7 @@ int GV_get_vectname(int id, char *filename)
 	return (-1);
 	return (-1);
     }
     }
 
 
-    strcpy(filename, gv->filename);
+    filename = G_store(gv->filename);
 
 
     return (1);
     return (1);
 }
 }

+ 3 - 0
lib/ogsf/gp.c

@@ -193,6 +193,7 @@ int gp_set_defaults(geosite * gp)
 
 
     GS_get_longdim(&dim);
     GS_get_longdim(&dim);
 
 
+    gp->filename = NULL;
     gp->n_sites = gp->use_z = gp->n_surfs = gp->use_mem = 0;
     gp->n_sites = gp->use_z = gp->n_surfs = gp->use_mem = 0;
     gp->x_trans = gp->y_trans = gp->z_trans = 0.0;
     gp->x_trans = gp->y_trans = gp->z_trans = 0.0;
     gp->size = dim / 100.;
     gp->size = dim / 100.;
@@ -338,6 +339,8 @@ void gp_free_sitemem(geosite * fp)
 {
 {
     geopoint *gpt, *tmp;
     geopoint *gpt, *tmp;
 
 
+    G_free((void *) fp->filename);
+    fp->filename = NULL;
     if (fp->points) {
     if (fp->points) {
 	for (gpt = fp->points; gpt;) {
 	for (gpt = fp->points; gpt;) {
 	    if (gpt->cattr) {
 	    if (gpt->cattr) {

+ 5 - 4
lib/ogsf/gsds.c

@@ -247,7 +247,7 @@ int gsds_newh(const char *name)
 	    new->dims[i] = 0;
 	    new->dims[i] = 0;
 	}
 	}
 
 
-	strcpy(new->unique_name, name);
+	new->unique_name = G_store(name);
 	new->databuff.fb = NULL;
 	new->databuff.fb = NULL;
 	new->databuff.ib = NULL;
 	new->databuff.ib = NULL;
 	new->databuff.sb = NULL;
 	new->databuff.sb = NULL;
@@ -304,7 +304,7 @@ char *gsds_get_name(int id)
 {
 {
     int i;
     int i;
     dataset *fds;
     dataset *fds;
-    static char retstr[160];
+    static char retstr[GPATH_MAX];
 
 
     for (i = 0; i < Numsets; i++) {
     for (i = 0; i < Numsets; i++) {
 	if (Data[i]->data_id == id) {
 	if (Data[i]->data_id == id) {
@@ -319,7 +319,7 @@ char *gsds_get_name(int id)
 }
 }
 
 
 /*!
 /*!
-  \brief ADD
+  \brief Free allocated dataset
 
 
   \param id
   \param id
 
 
@@ -338,7 +338,8 @@ int gsds_free_datah(int id)
 	    found = 1;
 	    found = 1;
 	    fds = Data[i];
 	    fds = Data[i];
 	    free_data_buffs(fds, ATTY_ANY);
 	    free_data_buffs(fds, ATTY_ANY);
-	    strcpy(fds->unique_name, "");
+	    G_free((void *)fds->unique_name);
+	    fds->unique_name = NULL;
 	    fds->data_id = 0;
 	    fds->data_id = 0;
 
 
 	    for (j = i; j < (Numsets - 1); j++) {
 	    for (j = i; j < (Numsets - 1); j++) {

+ 4 - 0
lib/ogsf/gv.c

@@ -187,6 +187,7 @@ int gv_set_defaults(geovect * gv)
 	return (-1);
 	return (-1);
     }
     }
 
 
+    gv->filename = NULL;
     gv->n_lines = gv->n_surfs = gv->use_mem = 0;
     gv->n_lines = gv->n_surfs = gv->use_mem = 0;
     gv->x_trans = gv->y_trans = gv->z_trans = 0.0;
     gv->x_trans = gv->y_trans = gv->z_trans = 0.0;
     gv->lines = NULL;
     gv->lines = NULL;
@@ -301,6 +302,9 @@ void gv_free_vectmem(geovect * fv)
 {
 {
     geoline *gln, *tmpln;
     geoline *gln, *tmpln;
 
 
+    G_free((void *) fv->filename);
+    fv->filename = NULL;
+    
     if (fv->lines) {
     if (fv->lines) {
 	for (gln = fv->lines; gln;) {
 	for (gln = fv->lines; gln;) {
 	    if (gln->dims == 2) {
 	    if (gln->dims == 2) {

+ 6 - 3
lib/ogsf/gvl_file.c

@@ -167,7 +167,7 @@ char *gvl_file_get_name(int id)
 {
 {
     int i;
     int i;
     geovol_file *fvf;
     geovol_file *fvf;
-    static char retstr[NAME_SIZ];
+    static char retstr[GPATH_MAX];
     
     
     for (i = 0; i < Numfiles; i++) {
     for (i = 0; i < Numfiles; i++) {
 	if (Data[i]->data_id == id) {
 	if (Data[i]->data_id == id) {
@@ -312,7 +312,7 @@ int gvl_file_newh(const char *name, IFLAG file_type)
 	Numfiles++;
 	Numfiles++;
 	new->data_id = Cur_id++;
 	new->data_id = Cur_id++;
 	
 	
-	strcpy(new->file_name, name);
+	new->file_name = G_store(name);
 	new->file_type = file_type;
 	new->file_type = file_type;
 	new->count = 1;
 	new->count = 1;
 	new->map = m;
 	new->map = m;
@@ -378,7 +378,10 @@ int gvl_file_free_datah(int id)
 	    } else {
 	    } else {
 		close_volfile(fvf->map, fvf->file_type);
 		close_volfile(fvf->map, fvf->file_type);
 		free_volfile_buffs(fvf);
 		free_volfile_buffs(fvf);
-		strcpy(fvf->file_name, "");
+
+		G_free(fvf->file_name);
+		fvf->file_name = NULL;
+
 		fvf->data_id = 0;
 		fvf->data_id = 0;
 		
 		
 		for (j = i; j < (Numfiles - 1); j++) {
 		for (j = i; j < (Numfiles - 1); j++) {