X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fcatsearch.c;h=6115a4e4c306f068509d9036a91859b5d6565e72;hb=5f5367aa2eedd7e8538566a83d163cc549c9d68f;hp=d927ad4b36dce74a1d08a1a47ad79d0245f34d6b;hpb=cd5246df10e6566010dfd460b63018f92551661a;p=netatalk.git diff --git a/etc/afpd/catsearch.c b/etc/afpd/catsearch.c index d927ad4b..6115a4e4 100644 --- a/etc/afpd/catsearch.c +++ b/etc/afpd/catsearch.c @@ -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 */ }; /* @@ -160,7 +160,7 @@ static int addstack(char *uname, struct dir *dir, int pidx) } /* Removes checked items from top of directory stack. Returns index of the first unchecked elements or -1. */ -static int reducestack() +static int reducestack(void) { int r; if (save_cidx != -1) { @@ -180,7 +180,7 @@ static int reducestack() } /* Clears directory stack. */ -static void clearstack() +static void clearstack(void) { save_cidx = -1; while (dsidx > 0) { @@ -233,12 +233,13 @@ static struct finderinfo *unpack_buffer(struct finderinfo *finfo, char *buffer) /* -------------------- */ static struct finderinfo * -unpack_finderinfo(char *upath, struct adouble *adp, struct finderinfo *finfo) +unpack_finderinfo(struct vol *vol, struct path *path, struct adouble **adp, struct finderinfo *finfo) { packed_finder buf; void *ptr; - ptr = get_finderinfo(upath, adp, &buf); + *adp = adl_lkup(vol, path, *adp); + ptr = get_finderinfo(vol, path->u_name, *adp, &buf); return unpack_buffer(finfo, ptr); } @@ -258,7 +259,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)) { @@ -303,7 +304,7 @@ static int crit_check(struct vol *vol, struct path *path) { if ((c1.rbitmap & (1<v_maccharset, CH_UCS2, path->m_name, strlen(path->m_name), convbuf, 512)) ) goto crit_check_ret; - convbuf[len] = 0; + if ((c1.rbitmap & (1<m_name, strlen(path->m_name), convbuf, 512, &flags))) { goto crit_check_ret; } - convbuf[len] = 0; + if (c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo); if (finfo->f_type != c1.finfo.f_type) goto crit_check_ret; } @@ -383,8 +383,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check creator ID */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo); } if (finfo->creator != c1.finfo.creator) goto crit_check_ret; @@ -393,8 +392,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check finder info attributes */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo); } if ((finfo->attrs & c2.finfo.attrs) != c1.finfo.attrs) @@ -404,8 +402,7 @@ static int crit_check(struct vol *vol, struct path *path) { /* Check label */ if ((c1.rbitmap & (1<u_name, adp, &finderinfo); + finfo = unpack_finderinfo(vol, path, &adp, &finderinfo); } if ((finfo->label & c2.finfo.label) != c1.finfo.label) goto crit_check_ret; @@ -425,7 +422,8 @@ static int rslt_add ( struct vol *vol, struct path *path, char **buf, int ext) { char *p = *buf; - int ret, tbuf =0; + int ret; + size_t tbuf =0; u_int16_t resultsize; int isdir = S_ISDIR(path->st.st_mode); @@ -665,8 +663,8 @@ catsearch_end: /* Exiting catsearch: error condition */ } /* catsearch() */ /* -------------------------- */ -int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen, int ext) +static int catsearch_afp(AFPObj *obj _U_, char *ibuf, size_t ibuflen, + char *rbuf, size_t *rbuflen, int ext) { struct vol *vol; u_int16_t vid; @@ -738,8 +736,8 @@ int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, } /* Parse file specifications */ - spec1 = ibuf; - spec2 = ibuf + spec_len + 2; + spec1 = (unsigned char*)ibuf; + spec2 = (unsigned char*)ibuf + spec_len + 2; spec1 += 2; spec2 += 2; @@ -829,10 +827,9 @@ int catsearch_afp(AFPObj *obj _U_, 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 ! */ @@ -863,7 +860,6 @@ int catsearch_afp(AFPObj *obj _U_, 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 */ @@ -889,15 +885,15 @@ int catsearch_afp(AFPObj *obj _U_, char *ibuf, int ibuflen, } /* catsearch_afp */ /* -------------------------- */ -int afp_catsearch (AFPObj *obj, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) +int afp_catsearch (AFPObj *obj, char *ibuf, size_t ibuflen, + char *rbuf, size_t *rbuflen) { return catsearch_afp( obj, ibuf, ibuflen, rbuf, rbuflen, 0); } -int afp_catsearch_ext (AFPObj *obj, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) +int afp_catsearch_ext (AFPObj *obj, char *ibuf, size_t ibuflen, + char *rbuf, size_t *rbuflen) { return catsearch_afp( obj, ibuf, ibuflen, rbuf, rbuflen, 1); }