summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
fe5ac55)
Avoid fprintf()'ing an error after the Perl code has already
returned an error, in the case where we're not returning data because
we're returning an error code.
int _PLfuse_ioctl(const char *file, int cmd, void *arg,
struct fuse_file_info *fi, unsigned int flags, void *data) {
int rv;
int _PLfuse_ioctl(const char *file, int cmd, void *arg,
struct fuse_file_info *fi, unsigned int flags, void *data) {
int rv;
FUSE_CONTEXT_PRE;
DEBUGf("ioctl begin\n");
ENTER;
FUSE_CONTEXT_PRE;
DEBUGf("ioctl begin\n");
ENTER;
PUTBACK;
rv = call_sv(MY_CXT.callback[39],G_ARRAY);
SPAGAIN;
PUTBACK;
rv = call_sv(MY_CXT.callback[39],G_ARRAY);
SPAGAIN;
- if (_IOC_DIR(cmd) & _IOC_READ) {
- if (rv == 2) {
- SV *sv = POPs;
+ if ((_IOC_DIR(cmd) & _IOC_READ) && (rv == 2)) {
+ sv = POPs;
+ rv--;
+ }
+
+ if (rv > 0)
+ rv = POPi;
+
+ if ((_IOC_DIR(cmd) & _IOC_READ) && !rv) {
+ if (sv) {
size_t len;
char *rdata = SvPV(sv, len);
size_t len;
char *rdata = SvPV(sv, len);
if (len > _IOC_SIZE(cmd)) {
fprintf(stderr, "ioctl(): returned data was too large for data area\n");
if (len > _IOC_SIZE(cmd)) {
fprintf(stderr, "ioctl(): returned data was too large for data area\n");
- if (rv > 0)
- rv = POPi;
FREETMPS;
LEAVE;
PUTBACK;
FREETMPS;
LEAVE;
PUTBACK;