RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 21-Nov-2007 22:58:48
Branch: HEAD Handle: 2007112121584602
Modified files:
rpm CHANGES
rpm/lib rpmchecksig.c rpmgi.c
rpm/rpmdb header.c header_internal.h pkgio.c pkgio.h
rpm/rpmio rpmio.c rpmio_internal.h
Log:
- functional (and leak free) queries of both *.rpm and *.xar.
- transparently recognize XAR magic when reading.
- eliminate rpmpkgClean, rpmxar memory free on Fclose instead.
Summary:
Revision Changes Path
1.1865 +4 -0 rpm/CHANGES
1.191 +0 -16 rpm/lib/rpmchecksig.c
2.42 +0 -2 rpm/lib/rpmgi.c
1.123 +7 -2 rpm/rpmdb/header.c
1.33 +1 -0 rpm/rpmdb/header_internal.h
1.51 +84 -99 rpm/rpmdb/pkgio.c
1.12 +0 -8 rpm/rpmdb/pkgio.h
1.106 +2 -1 rpm/rpmio/rpmio.c
2.91 +7 -8 rpm/rpmio/rpmio_internal.h
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1864 -r1.1865 CHANGES
--- rpm/CHANGES 21 Nov 2007 18:21:46 -0000 1.1864
+++ rpm/CHANGES 21 Nov 2007 21:58:46 -0000 1.1865
@@ -1,4 +1,8 @@
5.0a2 -> 5.0a3:
+ - jbj: functional (and leak free) queries of both *.rpm and *.xar.
+ - jbj: transparently recognize XAR magic when reading.
+ - jbj: eliminate rpmpkgClean, rpmxar memory free on Fclose instead.
+ - jbj: use refcounted rpmxar attached to FD_t to handle xar state.
- jbj: switch to using rpmxar instead of rpmwf most everywhere.
- jbj: stub in rpmio/rpmxar.c xar payload extraction.
- jbj: create rpmWriteHeader with error msg returns.
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmchecksig.c
============================================================================
$ cvs diff -u -r1.190 -r1.191 rpmchecksig.c
--- rpm/lib/rpmchecksig.c 21 Nov 2007 18:21:47 -0000 1.190
+++ rpm/lib/rpmchecksig.c 21 Nov 2007 21:58:47 -0000 1.191
@@ -16,8 +16,6 @@
#include "rpmgi.h"
#include <rpmxar.h>
-#define _RPMWF_INTERNAL
-#include <rpmwf.h>
#include <pkgio.h>
#include "signature.h"
@@ -27,7 +25,6 @@
/*@access Header @*/ /* XXX void * arg */
/*@access pgpDig @*/
/*@access pgpDigParams @*/
-/*@access rpmwf @*/
/*@unchecked@*/
int _print_pkts = 0;
@@ -782,7 +779,6 @@
/*@globals fileSystem, internalState @*/
/*@modifies fd, fileSystem, internalState @*/
{
-rpmwf wf = fdGetWF(fd);
pgpDig dig = fdGetDig(fd);
HGE_t hge = headerGetExtension;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
@@ -833,7 +829,6 @@
h = headerFree(h);
}
-if (wf == NULL) {
/* Read the payload from the package. */
while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
dig->nbytes += count;
@@ -841,7 +836,6 @@
rpmlog(RPMLOG_ERR, _("%s: Fread failed: %s\n"), fn, Fstrerror(fd));
goto exit;
}
-}
/* XXX Steal the digest-in-progress from the file handle. */
for (i = fd->ndigests - 1; i >= 0; i--) {
@@ -869,15 +863,6 @@
}
}
-if (wf != NULL) {
- if (dig->md5ctx)
- (void) rpmDigestUpdate(dig->md5ctx, wf->h, wf->nh);
- if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
- if ((rc = rpmwfPullXAR(wf, "Payload")) != RPMRC_OK) return rc;
- if (dig->md5ctx)
- (void) rpmDigestUpdate(dig->md5ctx, wf->p, wf->np);
-}
-
rc = RPMRC_OK; /* XXX unnecessary */
exit:
@@ -1198,7 +1183,6 @@
}
if (fd != NULL) {
- (void) rpmpkgClean(fd);
xx = Fclose(fd);
}
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmgi.c
============================================================================
$ cvs diff -u -r2.41 -r2.42 rpmgi.c
--- rpm/lib/rpmgi.c 21 Nov 2007 00:25:04 -0000 2.41
+++ rpm/lib/rpmgi.c 21 Nov 2007 21:58:47 -0000 2.42
@@ -143,7 +143,6 @@
/* XXX what if path needs expansion? */
rpmRC rpmrc = rpmReadPackageFile(gi->ts, fd, path, &h);
- (void) rpmpkgClean(fd);
(void) Fclose(fd);
switch (rpmrc) {
@@ -499,7 +498,6 @@
gi->fts = NULL;
}
if (gi->fd != NULL) {
- (void) rpmpkgClean(gi->fd);
(void) Fclose(gi->fd);
gi->fd = NULL;
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.122 -r1.123 header.c
--- rpm/rpmdb/header.c 21 Nov 2007 14:24:35 -0000 1.122
+++ rpm/rpmdb/header.c 21 Nov 2007 21:58:47 -0000 1.123
@@ -265,8 +265,13 @@
for (i = 0; i < h->indexUsed; i++, entry++) {
if ((h->flags & HEADERFLAG_ALLOCATED) && ENTRY_IS_REGION(entry)) {
if (entry->length > 0) {
- int_32 * ei = entry->data;
- if ((ei - 2) == h->blob) h->blob = _free(h->blob);
+ uint32_t * ei = entry->data;
+ if ((ei - 2) == h->blob) {
+ /* Adjust for XAR including 8b of magic. */
+ if (h->flags & HEADERFLAG_XARALLOCATED)
+ h->blob = &((char *)h->blob)[-8];
+ h->blob = _free(h->blob);
+ }
entry->data = NULL;
}
} else if (!ENTRY_IN_REGION(entry)) {
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header_internal.h
============================================================================
$ cvs diff -u -r1.32 -r1.33 header_internal.h
--- rpm/rpmdb/header_internal.h 17 Nov 2007 16:56:21 -0000 1.32
+++ rpm/rpmdb/header_internal.h 21 Nov 2007 21:58:47 -0000 1.33
@@ -102,6 +102,7 @@
#define HEADERFLAG_LEGACY (1 << 2) /*!< Header came from legacy source? */
#define HEADERFLAG_DEBUG (1 << 3) /*!< Debug this header? */
#define HEADERFLAG_SIGNATURE (1 << 4) /*!< Signature header? */
+#define HEADERFLAG_XARALLOCATED (1 << 5) /*!< Did XAR allocate the region? */
/*@refs@*/
int nrefs; /*!< Reference count. */
};
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/pkgio.c
============================================================================
$ cvs diff -u -r1.50 -r1.51 pkgio.c
--- rpm/rpmdb/pkgio.c 21 Nov 2007 18:21:47 -0000 1.50
+++ rpm/rpmdb/pkgio.c 21 Nov 2007 21:58:47 -0000 1.51
@@ -27,15 +27,12 @@
#include "rpmts.h"
#include <rpmxar.h>
-#define _RPMWF_INTERNAL
-#include <rpmwf.h>
#include "header_internal.h"
#include "signature.h"
#include "debug.h"
/*@access rpmts @*/
-/*@access rpmwf @*/
/*@access pgpDig @*/
/*@access pgpDigParams @*/
/*@access Header @*/ /* XXX compared with NULL */
@@ -462,7 +459,7 @@
/*@globals fileSystem @*/
/*@modifies *ptr, *msg, fileSystem @*/
{
-rpmwf wf = fdGetWF(fd);
+ rpmxar xar = fdGetXAR(fd);
struct rpmlead ** leadp = ptr;
struct rpmlead * l = xcalloc(1, sizeof(*l));
char buf[BUFSIZ];
@@ -472,12 +469,7 @@
buf[0] = '\0';
if (leadp != NULL) *leadp = NULL;
-if (wf != NULL) {
- if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
- if ((rc = rpmwfPullXAR(wf, "Lead")) != RPMRC_OK) return rc;
-assert(wf->nl == sizeof(*l));
- memcpy(l, wf->l, sizeof(*l));
-} else {
+ /* Read the first 96 bytes of the file. */
if ((xx = (int) timedRead(fd, (char *)l, sizeof(*l))) != (int) sizeof(*l)) {
if (Ferror(fd)) {
(void) snprintf(buf, sizeof(buf),
@@ -492,7 +484,35 @@
}
goto exit;
}
-}
+
+ /* Attach rpmxar handler to fd if this is a xar archive. */
+ if (xar == NULL) {
+ unsigned char * bh = (unsigned char *)l;
+ if (bh[0] == 'x' && bh[1] == 'a' && bh[2] == 'r' && bh[3] == '!') {
+ const char * fn = fdGetOPath(fd);
+ xar = rpmxarNew(fn, "r");
+ fdSetXAR(fd, xar);
+ (void) rpmxarFree(xar);
+ }
+ }
+
+ /* With XAR, read lead from a xar archive file called "Lead". */
+ if (xar != NULL) {
+ void *b;
+ size_t nb;
+ if ((xx = rpmxarNext(xar)) != 0) return RPMRC_FAIL;
+ if ((xx = rpmxarPull(xar, "Lead", &b, &nb)) != 0) return RPMRC_FAIL;
+ if (nb != sizeof(*l)) {
+ b = _free(b);
+ (void) snprintf(buf, sizeof(buf),
+ _("lead size(%u): BAD, xar read(%u)"),
+ (unsigned)sizeof(*l), (unsigned)nb);
+ rc = RPMRC_NOTFOUND;
+ goto exit;
+ }
+ memcpy(l, b, nb);
+ b = _free(b);
+ }
l->type = (unsigned short) ntohs(l->type);
l->archnum = (unsigned short) ntohs(l->archnum);
@@ -623,7 +643,7 @@
/*@globals fileSystem @*/
/*@modifies *ptr, *msg, fileSystem @*/
{
-rpmwf wf = fdGetWF(fd);
+rpmxar xar = fdGetXAR(fd);
HGE_t hge = headerGetExtension;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
Header * sighp = ptr;
@@ -643,17 +663,19 @@
rpmRC rc = RPMRC_FAIL; /* assume failure */
int xx;
uint32_t i;
+ unsigned char * bh = NULL;
+ size_t nbh = 0;
buf[0] = '\0';
if (sighp)
*sighp = NULL;
memset(block, 0, sizeof(block));
-if (wf != NULL) {
- if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
- if ((rc = rpmwfPullXAR(wf, "Signature")) != RPMRC_OK) return rc;
-assert(wf->ns > sizeof(block));
- memcpy(block, wf->s, sizeof(block));
+if (xar != NULL) {
+ if ((xx = rpmxarNext(xar)) != 0) return RPMRC_FAIL;
+ if ((xx = rpmxarPull(xar, "Signature", &bh, &nbh)) != 0) return RPMRC_FAIL;
+assert(nbh > sizeof(block));
+ memcpy(block, bh, sizeof(block));
} else {
if ((xx = (int) timedRead(fd, (void *)block, sizeof(block))) != (int) sizeof(block)) {
(void) snprintf(buf, sizeof(buf),
@@ -691,21 +713,21 @@
/*@-sizeoftype@*/
nb = (il * sizeof(struct entryInfo_s)) + dl;
/*@=sizeoftype@*/
- ei = xmalloc(sizeof(il) + sizeof(dl) + nb);
- ei[0] = block[2];
- ei[1] = block[3];
- pe = (entryInfo) &ei[2];
- dataStart = (unsigned char *) (pe + il);
-if (wf != NULL) {
-assert(wf->ns >= (sizeof(block)+nb));
- memcpy(pe, wf->s+sizeof(block), nb);
+if (xar != NULL) {
+assert(nbh >= (sizeof(block)+nb));
+ ei = &((uint32_t *)bh)[2];
} else {
- if ((xx = (int) timedRead(fd, (void *)pe, nb)) != (int) nb) {
+ ei = xmalloc(sizeof(il) + sizeof(dl) + nb);
+ if ((xx = (int) timedRead(fd, (void *)&ei[2], nb)) != (int) nb) {
(void) snprintf(buf, sizeof(buf),
_("sigh blob(%u): BAD, read returned %d\n"), (unsigned) nb, xx);
goto exit;
}
}
+ ei[0] = block[2];
+ ei[1] = block[3];
+ pe = (entryInfo) &ei[2];
+ dataStart = (unsigned char *) (pe + il);
/* Check (and convert) the 1st tag element. */
xx = headerVerifyInfo(1, dl, pe, &entry->info, 0);
@@ -789,6 +811,7 @@
(void) snprintf(buf, sizeof(buf), _("sigh load: BAD\n"));
goto exit;
}
+if (xar != NULL) sigh->flags |= HEADERFLAG_XARALLOCATED;
sigh->flags |= HEADERFLAG_ALLOCATED;
sigh->flags |= HEADERFLAG_SIGNATURE;
if (_newmagic) /* XXX FIXME: sigh needs its own magic. */
@@ -1170,9 +1193,6 @@
rpmRC rc = RPMRC_OK;
Header h;
- if (msg)
- *msg = NULL;
-
h = headerLoad((void *)ptr);
if (h == NULL)
rc = RPMRC_FAIL;
@@ -1194,7 +1214,7 @@
/*@globals fileSystem, internalState @*/
/*@modifies fd, *hdrp, *msg, fileSystem, internalState @*/
{
- rpmwf wf = fdGetWF(fd);
+rpmxar xar = fdGetXAR(fd);
pgpDig dig = fdGetDig(fd);
char buf[BUFSIZ];
uint32_t block[4];
@@ -1207,6 +1227,8 @@
Header h = NULL;
const char * origin = NULL;
rpmRC rc = RPMRC_FAIL; /* assume failure */
+ unsigned char * bh = NULL;
+ size_t nbh = 0;
int xx;
/* Create (if not already) a signature parameters container. */
@@ -1219,15 +1241,17 @@
if (hdrp)
*hdrp = NULL;
- if (msg)
- *msg = NULL;
memset(block, 0, sizeof(block));
-if (wf != NULL) {
- if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
- if ((rc = rpmwfPullXAR(wf, "Header")) != RPMRC_OK) return rc;
-assert(wf->nh > sizeof(block));
- memcpy(block, wf->h, sizeof(block));
+if (xar != NULL) {
+ if ((xx = rpmxarNext(xar)) != 0) return RPMRC_FAIL;
+ if ((xx = rpmxarPull(xar, "Header", &bh, &nbh)) != 0) return RPMRC_FAIL;
+ if (nbh <= sizeof(block)) {
+ (void) snprintf(buf, sizeof(buf),
+ _("hdr size(%u): BAD, xar read returned %u\n"), (unsigned)sizeof(block), (unsigned)nb);
+ goto exit;
+ }
+ memcpy(block, bh, sizeof(block));
} else {
if ((xx = (int) timedRead(fd, (char *)block, sizeof(block))) != (int)sizeof(block)) {
(void) snprintf(buf, sizeof(buf),
@@ -1262,19 +1286,24 @@
nb = (il * sizeof(struct entryInfo_s)) + dl;
/*@=sizeoftype@*/
uc = sizeof(il) + sizeof(dl) + nb;
- ei = xmalloc(uc);
- ei[0] = block[2];
- ei[1] = block[3];
-if (wf != NULL) {
-assert(wf->nh == (sizeof(block)+nb));
- memcpy(&ei[2], wf->h+sizeof(block), nb);
+if (xar != NULL) {
+ if (nbh != (sizeof(block)+nb)) {
+ (void) snprintf(buf, sizeof(buf),
+ _("hdr size(%u): BAD, xar read returned %u\n"), (unsigned)(sizeof(block)+nb), (unsigned)nb);
+ goto exit;
+ }
+ ei = &((uint32_t *)bh)[2];
} else {
+ bh = xmalloc(uc);
+ ei = (uint32_t *)bh;
if ((xx = (int) timedRead(fd, (char *)&ei[2], nb)) != (int) nb) {
(void) snprintf(buf, sizeof(buf),
_("hdr blob(%u): BAD, read returned %d\n"), (unsigned)nb, xx);
goto exit;
}
}
+ ei[0] = block[2];
+ ei[1] = block[3];
/* Sanity check header tags */
rc = headerCheck(dig, ei, uc, msg);
@@ -1287,8 +1316,9 @@
(void) snprintf(buf, sizeof(buf), _("hdr load: BAD\n"));
goto exit;
}
+if (xar != NULL) h->flags |= HEADERFLAG_XARALLOCATED;
h->flags |= HEADERFLAG_ALLOCATED;
- ei = NULL; /* XXX will be freed with header */
+ bh = NULL; /* XXX will be freed with header */
/* Save the opened path as the header origin. */
origin = fdGetOPath(fd);
@@ -1298,7 +1328,7 @@
exit:
if (hdrp && h && rc == RPMRC_OK)
*hdrp = headerLink(h);
- ei = _free(ei);
+ bh = _free(bh);
h = headerFree(h);
if (msg != NULL && *msg == NULL && buf[0] != '\0') {
@@ -1321,38 +1351,8 @@
/*@globals fileSystem @*/
/*@modifies fd, *ptr, *msg, fileSystem @*/
{
-rpmwf wf = fdGetWF(fd);
Header * hdrp = ptr;
- Header h = NULL;
- rpmRC rc = RPMRC_OK;
- int xx;
-
- if (msg)
- *msg = NULL;
-
-if (wf != NULL) {
-uint32_t * ei;
- if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
- if ((rc = rpmwfPullXAR(wf, "Header")) != RPMRC_OK) return rc;
-ei = (uint32_t *)wf->h;
-fprintf(stderr, "==> Header %p[%u] 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", wf->h, (unsigned) wf->nh, ei[0], ei[1], ei[2], ei[3], ei[4], ei[5]);
- h = headerLoad(&ei[2]);
- if (h == NULL) {
- if (msg)
- *msg = xstrdup(_("headerLoad failed"));
- rc = RPMRC_FAIL;
- }
-} else {
- rc = rpmReadHeader(fd, &h, msg);
-}
-
- if (rc != RPMRC_OK)
- return rc;
- if (hdrp)
- *hdrp = headerLink(h);
- h = headerFree(h);
-
- return rc;
+ return rpmReadHeader(fd, hdrp, msg);
}
/**
@@ -1393,6 +1393,9 @@
{
rpmRC rc = RPMRC_FAIL;
+ if (msg)
+ *msg = NULL;
+
if (!strcmp(fn, "Header"))
rc = ckHeader(fd, ptr, msg);
return rc;
@@ -1402,17 +1405,8 @@
{
rpmRC rc = RPMRC_FAIL;
-if (_use_xar) {
-rpmwf wf = fdGetWF(fd);
-const char * fn = fdGetOPath(fd);
-if (wf == NULL) {
- wf = rpmwfNew(fn);
- fdSetWF(fd, wf);
- wf->xar = rpmxarNew(fn, "r");
- assert(wf->xar != NULL);
-}
-assert(wf != NULL);
-}
+ if (msg)
+ *msg = NULL;
if (!strcmp(fn, "Lead"))
rc = rdLead(fd, ptr, msg);
@@ -1429,6 +1423,9 @@
{
rpmRC rc = RPMRC_FAIL;
+ if (msg)
+ *msg = NULL;
+
if (!strcmp(fn, "Lead"))
rc = wrLead(fd, ptr, msg);
else
@@ -1439,15 +1436,3 @@
rc = wrHeader(fd, ptr, msg);
return rc;
}
-
-rpmRC rpmpkgClean(FD_t fd)
-{
- rpmwf wf = fdGetWF(fd);
- if (wf != NULL) {
- fdSetWF(fd, NULL);
-/*@-dependenttrans -modfilesys -observertrans -refcounttrans @*/
- wf = rpmwfFree(wf);
-/*@=dependenttrans =modfilesys =observertrans =refcounttrans @*/
- }
- return RPMRC_OK;
-}
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/pkgio.h
============================================================================
$ cvs diff -u -r1.11 -r1.12 pkgio.h
--- rpm/rpmdb/pkgio.h 20 Nov 2007 21:45:23 -0000 1.11
+++ rpm/rpmdb/pkgio.h 21 Nov 2007 21:58:47 -0000 1.12
@@ -80,14 +80,6 @@
/*@globals fileSystem @*/
/*@modifies ptr, *msg, fileSystem @*/;
-/**
- * Clean attached data.
- * @param fd file handle
- * @return RPMRC_OK on success
- */
-rpmRC rpmpkgClean(FD_t fd)
- /*@modifies fd @*/;
-
#ifdef __cplusplus
}
#endif
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmio.c
============================================================================
$ cvs diff -u -r1.105 -r1.106 rpmio.c
--- rpm/rpmio/rpmio.c 20 Nov 2007 18:44:25 -0000 1.105
+++ rpm/rpmio/rpmio.c 21 Nov 2007 21:58:48 -0000 1.106
@@ -345,6 +345,7 @@
}
fd->ndigests = 0;
/*@-onlytrans@*/
+ fd->xar = rpmxarFree(fd->xar);
fd->dig = pgpDigFree(fd->dig);
/*@=onlytrans@*/
memset(fd, 0, sizeof(*fd)); /* XXX trash and burn */
@@ -383,7 +384,7 @@
fd->syserrno = 0;
fd->errcookie = NULL;
fd->stats = xcalloc(1, sizeof(*fd->stats));
- fd->wf = NULL;
+ fd->xar = NULL;
fd->dig = NULL;
fd->ndigests = 0;
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmio_internal.h
============================================================================
$ cvs diff -u -r2.90 -r2.91 rpmio_internal.h
--- rpm/rpmio/rpmio_internal.h 21 Nov 2007 14:24:36 -0000 2.90
+++ rpm/rpmio/rpmio_internal.h 21 Nov 2007 21:58:48 -0000 2.91
@@ -15,6 +15,7 @@
#include <rpmpgp.h>
#include <rpmsw.h>
+#include <rpmxar.h>
/* Drag in the beecrypt includes. */
#include <beecrypt/beecrypt.h>
@@ -187,8 +188,8 @@
int oflags;
mode_t omode;
-/*@kept@*/
- void * wf; /* wrapper format descriptor */
+/*@refcounted@*/ /*@relnull@*/
+ rpmxar xar; /* xar archive wrapper */
/*@refcounted@*/ /*@relnull@*/
pgpDig dig; /* signature parameters */
@@ -345,24 +346,22 @@
/** \ingroup rpmio
*/
/*@unused@*/ static inline
-void fdSetWF(FD_t fd, /*@kept@*/ void * wf)
+void fdSetXAR(FD_t fd, rpmxar xar)
/*@modifies fd @*/
{
FDSANE(fd);
- /*@-assignexpose@*/
- fd->wf = wf;
- /*@=assignexpose@*/
+ fd->xar = rpmxarLink(xar, "fdSetXAR");
}
/** \ingroup rpmio
*/
/*@unused@*/ static inline
-/*@null@*/ /*@kept@*/ void * fdGetWF(FD_t fd)
+/*@null@*/ /*@kept@*/ void * fdGetXAR(FD_t fd)
/*@*/
{
FDSANE(fd);
/*@-retexpose -usereleased @*/
- return fd->wf;
+ return fd->xar;
/*@=retexpose =usereleased @*/
}
@@ .
Received on Wed Nov 21 22:58:48 2007