if (reply.num_extents > SIZE_T_MAX / sizeof(FSXCharInfo)) return FSBadAlloc;
FSQueryXExtents8(svr, fid, range_type, str, str_len, extents)    FSServer   *svr;    Font        fid;    Bool        range_type;    unsigned char *str;    unsigned long str_len;    FSXCharInfo **extents;{    fsQueryXExtents8Req *req;    fsQueryXExtents8Reply reply;    FSXCharInfo *ext;    fsXCharInfo local_exts;    int         i;    GetReq(QueryXExtents8, req);    req->fid = fid;    req->range = range_type;    req->num_ranges = str_len;    req->length += (str_len + 3) >> 2;    _FSSend(svr, (char *) str, str_len);    /* get back the info */    if (!_FSReply(svr, (fsReply *) & reply,	       (SIZEOF(fsQueryXExtents8Reply) - SIZEOF(fsGenericReply)) >> 2,		  fsFalse))	return FSBadAlloc;    ext = (FSXCharInfo *) FSmalloc(sizeof(FSXCharInfo) * reply.num_extents);    *extents = ext;    if (!ext)	return FSBadAlloc;    for (i = 0; i < reply.num_extents; i++) {	_FSReadPad(svr, (char *) &local_exts, SIZEOF(fsXCharInfo));	_FS_convert_char_info(&local_exts, &ext[i]);    }    SyncHandle();    return FSSuccess;}