]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/catsearch.c
in unicode function convert_charset needs trailing zero, spotted by HAT
[netatalk.git] / etc / afpd / catsearch.c
index 3d95d14b5414f6c8bfd45cdbb51d8805a9085144..2c0a6a3d810141071adde345088995718e68e354 100644 (file)
@@ -97,7 +97,7 @@ struct scrit {
     u_int16_t offcnt;           /* Offspring count */
        struct finderinfo finfo;    /* Finder info */
        char lname[64];             /* Long name */ 
-       char utf8name[512];         /* UTF8 name */
+       char utf8name[514];         /* UTF8 or UCS2 name */ /* for convert_charset dest_len parameter +2 */
 };
 
 /*
@@ -117,7 +117,7 @@ struct dsitem {
  
 
 #define DS_BSIZE 128
-static int cur_pos = 0;    /* Saved position index (ID) - used to remember "position" across FPCatSearch calls */
+static u_int32_t cur_pos = 0;    /* Saved position index (ID) - used to remember "position" across FPCatSearch calls */
 static DIR *dirpos = NULL; /* UNIX structure describing currently opened directory. */
 static int save_cidx = -1; /* Saved index of currently scanned directory. */
 
@@ -258,7 +258,7 @@ static int crit_check(struct vol *vol, struct path *path) {
        struct adouble *adp = NULL;
        time_t c_date, b_date;
        u_int32_t ac_date, ab_date;
-       static char convbuf[512];
+       static char convbuf[514]; /* for convert_charset dest_len parameter +2 */
        size_t len;
 
        if (S_ISDIR(path->st.st_mode)) {
@@ -301,7 +301,7 @@ static int crit_check(struct vol *vol, struct path *path) {
        if ((c1.rbitmap & (1<<DIRPBIT_LNAME))) { 
                if ( (size_t)(-1) == (len = convert_string(vol->v_maccharset, CH_UCS2, path->m_name, strlen(path->m_name), convbuf, 512)) )
                        goto crit_check_ret;
-               convbuf[len] = 0; 
+
                if ((c1.rbitmap & (1<<CATPBIT_PARTIAL))) {
                        if (strcasestr_w( (ucs2_t*) convbuf, (ucs2_t*) c1.lname) == NULL)
                                goto crit_check_ret;
@@ -314,7 +314,7 @@ static int crit_check(struct vol *vol, struct path *path) {
                if ( (size_t)(-1) == (len = convert_charset( CH_UTF8_MAC, CH_UCS2, CH_UTF8, path->m_name, strlen(path->m_name), convbuf, 512, &flags))) {
                        goto crit_check_ret;
                }
-               convbuf[len] = 0; 
+
                if (c1.rbitmap & (1<<CATPBIT_PARTIAL)) {
                        if (strcasestr_w((ucs2_t *) convbuf, (ucs2_t*)c1.utf8name) == NULL)
                                goto crit_check_ret;
@@ -484,7 +484,7 @@ static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext)
  */
 #define NUM_ROUNDS 100
 static int catsearch(struct vol *vol, struct dir *dir,  
-                    int rmatches, int *pos, char *rbuf, u_int32_t *nrecs, int *rsize, int ext)
+                    int rmatches, u_int32_t *pos, char *rbuf, u_int32_t *nrecs, int *rsize, int ext)
 {
        int cidx, r;
        struct dirent *entry;
@@ -499,8 +499,10 @@ static int catsearch(struct vol *vol, struct dir *dir,
     int num_rounds = NUM_ROUNDS;
     int cached;
         
-       if (*pos != 0 && *pos != cur_pos) 
-               return AFPERR_CATCHNG;
+       if (*pos != 0 && *pos != cur_pos) {
+               result = AFPERR_CATCHNG;
+               goto catsearch_end;
+       }
 
        /* FIXME: Category "offspring count ! */
 
@@ -661,7 +663,7 @@ catsearch_end: /* Exiting catsearch: error condition */
 } /* catsearch() */
 
 /* -------------------------- */
-int catsearch_afp(AFPObj *obj, char *ibuf, int ibuflen,
+int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen,
                   char *rbuf, int *rbuflen, int ext)
 {
     struct vol *vol;
@@ -825,10 +827,9 @@ int catsearch_afp(AFPObj *obj, char *ibuf, int ibuflen,
         /* Get the long filename */    
                memcpy(tmppath, bspec1 + spec1[1] + 1, (bspec1 + spec1[1])[0]);
                tmppath[(bspec1 + spec1[1])[0]]= 0;
-               len = convert_string ( vol->v_maccharset, CH_UCS2, tmppath, strlen(tmppath), c1.lname, 64);
+               len = convert_string ( vol->v_maccharset, CH_UCS2, tmppath, strlen(tmppath), c1.lname, sizeof(c1.lname));
         if (len == (size_t)(-1))
             return AFPERR_PARAM;
-               c1.lname[len] = 0;
 
 #if 0  
                /* FIXME: do we need it ? It's always null ! */
@@ -859,7 +860,6 @@ int catsearch_afp(AFPObj *obj, char *ibuf, int ibuflen,
                len = convert_charset(CH_UTF8_MAC, CH_UCS2, CH_UTF8, c1.utf8name, namelen, c1.utf8name, 512, &flags);
         if (len == (size_t)(-1))
             return AFPERR_PARAM;
-               c1.utf8name[len]=0;
     }
     
     /* Call search */