Bug 47504
Summary: | read/write -1 bytes | ||||||
---|---|---|---|---|---|---|---|
Product: | [Retired] Red Hat Raw Hide | Reporter: | Nathan Owen <owenna> | ||||
Component: | rpm | Assignee: | Jeff Johnson <jbj> | ||||
Status: | CLOSED DEFERRED | QA Contact: | David Lawrence <dkl> | ||||
Severity: | medium | Docs Contact: | |||||
Priority: | medium | ||||||
Version: | 1.0 | ||||||
Target Milestone: | --- | ||||||
Target Release: | --- | ||||||
Hardware: | All | ||||||
OS: | Linux | ||||||
Whiteboard: | |||||||
Fixed In Version: | Doc Type: | Bug Fix | |||||
Doc Text: | Story Points: | --- | |||||
Clone Of: | Environment: | ||||||
Last Closed: | 2001-08-01 21:45:42 UTC | Type: | --- | ||||
Regression: | --- | Mount Type: | --- | ||||
Documentation: | --- | CRM: | |||||
Verified Versions: | Category: | --- | |||||
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
Cloudforms Team: | --- | Target Upstream Version: | |||||
Embargoed: | |||||||
Attachments: |
|
Description
Red Hat Bugzilla
2001-07-05 19:41:45 UTC
Can you append the output of an example with --rpmiodebug set? That should be enough for me to figger what's up and get a fix in place, as the rpmio code is guaranteed to make your head hurt :-) Created attachment 22827 [details]
this is the output from rpm -qp ~/rpms/sed-3.02-9.src.rpm --rpmiodebug
Here's the relevant piece: => Ferror(2f6d0) rc 0 | UFD 6 fp 0 ==> Fileno(2f6d0) rc 6 | UFD 6 fp 0 ==> fdRead(2f6d0,efffe190,96) rc -1 | UFD 6 fp 0 *** read: rc -1 errno 22 Invalid argument "" error: read failed: Invalid argument (22) ==> Fclose(2f6d0) | UFD 6 fp Here's the code: rc = read(fdFileno(fd), buf, (count > fd->bytesRemain ? fd->bytesRemain : count)); The underlying issue is multiplexing mutiple I/O streams across an open file descriptor of, say, a persistent HTTP/1.1 connection, so fdRead() needs to simulate EOF based on ContentLength:. value, if present. So the problem seems to be with the ssize_t prototype being treated differently on Solaris in read(2) (from rpmio/rpmio_internal.h) ssize_t bytesRemain; ssize_t contentLength; Ah yes, the comparison on linux is (casts added for clatity) unsigned ((size_t)count) > ((ssize_t)fd->bytes_remain) so the problem is (I predict) that size_t is int, not unsigned, on Solaris. If that's the case, I can get an unsigned cast in place throughout rpmio comparisons in a jiffy. Well a size_t is being defined as an unsigned int in sys/types.h, and when I tried it that cast had no effect. after rereading the manpage for read I noticed this line: If the value of nbyte is greater than SSIZE_MAX, the result is implementation-dependent. It looks to me like the implementation in solaris 2.6 just considers this to be an error. Nathan- Since we use rpm on a lot of platforms (including Solaris) too, I just built rpm from CVS on a Solaris 2.8 box, and I can't reproduce this problem. Do you have Solaris 2.8, and is the problem happening there too? Other than some build issues, rpm from CVS has worked for the few tests I've tried. I tried building rpm from CVS on 2.6, but the db-3.3.11 build (part of rpm) causes Solaris' `ar' command to core dump, and I can't take any of our 2.6 systems down to apply the latest patch bundle to see if the problem goes away. Unfortunately I only have access to 2.6 systems here so I can't say anything about 2.7 or 2.8. I cannot reach the CVS server from work so I've been working with the rawhide packages and building them with the GNUpro tools so I don't know whether the patches from Sun would fix your problem. FWIW I'm using GNU ar 2.9-gnupro-99r1 Other than this one, I have not found any problems with rpms behavior beyond some build issues (most of them have already gotten into CVS). I have a rather trivial patch that fixes this problem if you get past your build problem. So far this problem is localized to a single solaris 2.6 box (sorry Nathan), I'm gonna defer this problem until someone tells me what the right thing to do is. |