public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Overload = and copy in element classes; prevents copy leading to double free. Date: Wed, 21 May 2008 18:12:00 -0000 [thread overview] Message-ID: <20080521181222.31999.qmail@sourceware.org> (raw) The branch, master has been updated via ac46ba63440998b66f7038c8fe0efad8036186ff (commit) from 14acd83ef32ae48dfd81962026102a522edb1931 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit ac46ba63440998b66f7038c8fe0efad8036186ff Author: Andrew Cagney <cagney@redhat.com> Date: Wed May 21 14:09:56 2008 -0400 Overload = and copy in element classes; prevents copy leading to double free. frysk-sys/frysk/sys/ChangeLog 2008-05-21 Andrew Cagney <cagney@redhat.com> * jni/Fork.cxx (spawn): Use elements(), not .p. * jni/Signal.cxx-sh (frysk): Ditto. frysk-sys/frysk/sys/proc/ChangeLog 2008-05-21 Andrew Cagney <cagney@redhat.com> * jni/AuxvBuilder.cxx (verify): Use length() and elements(). * jni/Stat.cxx (Stat::scan): Ditto. * jni/MapsBuilder.cxx (construct): Ditto. * jni/CmdLineBuilder.cxx (construct): Ditto. * jni/Status.cxx (Status::scan): Ditto. frysk-sys/frysk/sys/ptrace/ChangeLog 2008-05-21 Andrew Cagney <cagney@redhat.com> * jni/AddressSpace.cxx (AddressSpace::transfer): Use elements(). * jni/RegisterSet.cxx (RegisterSet::transfer): Ditto. frysk-sys/jnixx/ChangeLog 2008-05-21 Andrew Cagney <cagney@redhat.com> * elements.hxx (class StringChars): Implement operator=, copy constructor, add elements(), rename free() to release(). (class StringArrayChars): Ditto. (class Bytes): Add virtual elements() and length(), operator= and copy constructor. (class FileBytes): Implement. (class ArrayBytes): Implement. * elements.cxx (FileBytes::FileBytes): Update. * Native.java (throwElements): New. * TestJnixx.java (testElementRelease()): New. * jni/Native.cxx (Native::throwElements): New. * cni/Native.cxx (Native::throwElements): New. * jni/Native.cxx (Native::throwElements): New. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/sys/ChangeLog | 5 + frysk-sys/frysk/sys/jni/Fork.cxx | 15 ++- frysk-sys/frysk/sys/jni/Signal.cxx-sh | 4 +- frysk-sys/frysk/sys/proc/ChangeLog | 8 ++ frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx | 16 ++-- frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx | 12 +- frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx | 10 +- frysk-sys/frysk/sys/proc/jni/Stat.cxx | 6 +- frysk-sys/frysk/sys/proc/jni/Status.cxx | 6 +- frysk-sys/frysk/sys/ptrace/ChangeLog | 5 + frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx | 4 +- frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx | 2 +- frysk-sys/jnixx/ChangeLog | 16 +++ frysk-sys/jnixx/Native.java | 3 + frysk-sys/jnixx/TestJnixx.java | 13 ++ frysk-sys/jnixx/cni/Native.cxx | 7 + frysk-sys/jnixx/elements.cxx | 113 +++++++++++-------- frysk-sys/jnixx/elements.hxx | 135 ++++++++++++++++++----- frysk-sys/jnixx/jni/Native.cxx | 26 +++++ 19 files changed, 292 insertions(+), 114 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index 22e3cb0..c6f46b9 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,3 +1,8 @@ +2008-05-21 Andrew Cagney <cagney@redhat.com> + + * jni/Fork.cxx (spawn): Use elements(), not .p. + * jni/Signal.cxx-sh (frysk): Ditto. + 2008-05-20 Andrew Cagney <cagney@redhat.com> * jni/Signal.cxx-sh: Don't leak JNI string pointers. diff --git a/frysk-sys/frysk/sys/jni/Fork.cxx b/frysk-sys/frysk/sys/jni/Fork.cxx index 9a4e5f2..83b23c1 100644 --- a/frysk-sys/frysk/sys/jni/Fork.cxx +++ b/frysk-sys/frysk/sys/jni/Fork.cxx @@ -168,13 +168,14 @@ spawn(jnixx::env env, java::io::File exe, StringChars errPath = StringChars(env, err); int argc = args.GetArrayLength(env); StringArrayChars argv = StringArrayChars(env, args); - int pid = ::spawn(exePath.p, inPath.p, outPath.p, errPath.p, - argc, argv.p, (char**)environ, trace); - argv.free(); - exePath.free(); - inPath.free(); - outPath.free(); - errPath.free(); + int pid = ::spawn(exePath.elements(), + inPath.elements(), outPath.elements(), errPath.elements(), + argc, argv.elements(), (char**)environ, trace); + argv.release(); + exePath.release(); + inPath.release(); + outPath.release(); + errPath.release(); if (pid < 0) { switch (trace) { case NO_TRACE: diff --git a/frysk-sys/frysk/sys/jni/Signal.cxx-sh b/frysk-sys/frysk/sys/jni/Signal.cxx-sh index feb62e8..f9744ce 100644 --- a/frysk-sys/frysk/sys/jni/Signal.cxx-sh +++ b/frysk-sys/frysk/sys/jni/Signal.cxx-sh @@ -73,8 +73,8 @@ frysk::sys::Signal::tkill(::jnixx::env env, jint tid, jint sig, if (::syscall(__NR_tkill, tid, sig) < 0) { StringChars sname = StringChars(env, name); errnoException(env, errno, "tkill", "task %d, signal %s (%d)", - tid, sname.p, sig); - sname.free(); // happens during unwind + tid, sname.elements(), sig); + sname.release(); // happens during unwind } } diff --git a/frysk-sys/frysk/sys/proc/ChangeLog b/frysk-sys/frysk/sys/proc/ChangeLog index c88c933..fd90b11 100644 --- a/frysk-sys/frysk/sys/proc/ChangeLog +++ b/frysk-sys/frysk/sys/proc/ChangeLog @@ -1,3 +1,11 @@ +2008-05-21 Andrew Cagney <cagney@redhat.com> + + * jni/AuxvBuilder.cxx (verify): Use length() and elements(). + * jni/Stat.cxx (Stat::scan): Ditto. + * jni/MapsBuilder.cxx (construct): Ditto. + * jni/CmdLineBuilder.cxx (construct): Ditto. + * jni/Status.cxx (Status::scan): Ditto. + 2008-05-20 Andrew Cagney <cagney@redhat.com> * jni/Status.cxx: Implement. diff --git a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx index a0b957f..a0fc849 100644 --- a/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/AuxvBuilder.cxx @@ -98,10 +98,10 @@ static bool verify(Bytes& buf, get_t *get) { int wordSize = abs (get (NULL)); // Buffer holds an exact multiple of entry-size (2*word)? - if (buf.length % (wordSize * 2) != 0) + if (buf.length() % (wordSize * 2) != 0) return false; - for (int i = 0; i < buf.length; i += 2 * wordSize) { - jbyte *p = buf.elements + i; + for (int i = 0; i < buf.length(); i += 2 * wordSize) { + jbyte *p = buf.elements() + i; int64_t type = get (p); // Reasonable value? if (type > 1024 || type < 0) @@ -112,9 +112,9 @@ verify(Bytes& buf, get_t *get) { // on 64-bit arch, there's one AT_NULL at the end of auxv vector. // However, there's 3 AT_NULL for 32-bit application on 64-bit arch. if (type == 0) { - if ((i + 2 * wordSize) == buf.length) + if ((i + 2 * wordSize) == buf.length()) return true; - else if ((i + (2 * wordSize) * 3) == buf.length) + else if ((i + (2 * wordSize) * 3) == buf.length()) return true; else return false; @@ -167,12 +167,12 @@ construct(jnixx::env env, AuxvBuilder builder, Bytes& buf) { int wordSize = abs(get (NULL)); bool bigEndian = get(NULL) > 0; - int numberEntries = buf.length / wordSize / 2; + int numberEntries = buf.length() / wordSize / 2; builder.buildDimensions(env, wordSize, bigEndian, numberEntries); // Unpack the corresponding entries. for (int i = 0; i < numberEntries; i++) { - jbyte *p = buf.elements + wordSize * i * 2; + jbyte *p = buf.elements() + wordSize * i * 2; jint type = get(p + wordSize * 0); jlong value = get(p + wordSize * 1); builder.buildAuxiliary(env, i, type, value); @@ -184,7 +184,7 @@ construct(jnixx::env env, AuxvBuilder builder, Bytes& buf) { bool AuxvBuilder::construct(jnixx::env env, jint pid) { FileBytes bytes = FileBytes(env, "/proc/%d/auxv", pid); - if (bytes.elements == NULL) + if (bytes.elements() == NULL) return false; bool ok = ::construct(env, *this, bytes); bytes.release(); diff --git a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx index 8a432db..fc150ed 100644 --- a/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/CmdLineBuilder.cxx @@ -49,8 +49,8 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder, Bytes& bytes) { // Count the number of parameters. int argc = 0; - for (int i = 0; i < bytes.length; i++) { - if (bytes.elements[i] == '\0') + for (int i = 0; i < bytes.length(); i++) { + if (bytes.elements()[i] == '\0') argc++; } @@ -61,9 +61,9 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder, // Copy over the strings. int start = 0; argc = 0; - for (int i = 0; i < bytes.length; i++) { - if (bytes.elements[i] == '\0') { - argv.SetObjectArrayElement(env, argc, String::NewStringUTF(env, (const char*)bytes.elements + start)); + for (int i = 0; i < bytes.length(); i++) { + if (bytes.elements()[i] == '\0') { + argv.SetObjectArrayElement(env, argc, String::NewStringUTF(env, (const char*)bytes.elements() + start)); start = i + 1; argc++; } @@ -75,7 +75,7 @@ construct(jnixx::env env, frysk::sys::proc::CmdLineBuilder* builder, bool frysk::sys::proc::CmdLineBuilder::construct(jnixx::env env, jint pid) { FileBytes bytes = FileBytes(env, pid, "cmdline"); - if (bytes.elements == NULL) + if (bytes.elements() == NULL) return false; bool ok = ::construct(env, this, bytes); bytes.release(); diff --git a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx index 462da09..4c543da 100644 --- a/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx +++ b/frysk-sys/frysk/sys/proc/jni/MapsBuilder.cxx @@ -50,8 +50,8 @@ bool construct(jnixx::env env, frysk::sys::proc::MapsBuilder* builder, Bytes& buf) { - const char *start = (const char *) buf.elements; - const char *end = start + buf.length; + const char *start = (const char *) buf.elements(); + const char *end = start + buf.length(); const char *p = start; while (p < end) { if (isspace (*p)) @@ -111,12 +111,12 @@ frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jnixx::byteArray buf) { bool frysk::sys::proc::MapsBuilder::construct(jnixx::env env, jint pid) { FileBytes bytes = FileBytes(env, pid, "maps"); - if (bytes.elements == NULL) + if (bytes.elements() == NULL) return false; { - jnixx::byteArray array = jnixx::byteArray::NewByteArray(env, bytes.length); + jnixx::byteArray array = jnixx::byteArray::NewByteArray(env, bytes.length()); ArrayBytes b = ArrayBytes(env, array); - memcpy(b.elements, bytes.elements, bytes.length); + memcpy(b.elements(), bytes.elements(), bytes.length()); b.release(); buildBuffer(env, array); array.DeleteLocalRef(env); diff --git a/frysk-sys/frysk/sys/proc/jni/Stat.cxx b/frysk-sys/frysk/sys/proc/jni/Stat.cxx index df0e85a..e14e2f7 100644 --- a/frysk-sys/frysk/sys/proc/jni/Stat.cxx +++ b/frysk-sys/frysk/sys/proc/jni/Stat.cxx @@ -131,9 +131,9 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid, jint threadTid) { frysk::sys::proc::Stat frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) { FileBytes bytes = FileBytes(env, procPid, "stat"); - if (bytes.elements == NULL) + if (bytes.elements() == NULL) return Stat(env, NULL); - ::scan(env, (const char*) bytes.elements, *this, GetFine(env)); + ::scan(env, (const char*) bytes.elements(), *this, GetFine(env)); bytes.release(); return *this; } @@ -141,7 +141,7 @@ frysk::sys::proc::Stat::scan(jnixx::env env, jint procPid) { frysk::sys::proc::Stat frysk::sys::proc::Stat::scan(jnixx::env env, jnixx::byteArray buf) { ArrayBytes bytes = ArrayBytes(env, buf); - ::scan(env, (const char*) bytes.elements, *this, GetFine(env)); + ::scan(env, (const char*) bytes.elements(), *this, GetFine(env)); bytes.release(); return *this; } diff --git a/frysk-sys/frysk/sys/proc/jni/Status.cxx b/frysk-sys/frysk/sys/proc/jni/Status.cxx index 8aae8d4..fe094d9 100644 --- a/frysk-sys/frysk/sys/proc/jni/Status.cxx +++ b/frysk-sys/frysk/sys/proc/jni/Status.cxx @@ -115,9 +115,9 @@ scan(jnixx::env env, const char *p, Status status, frysk::rsl::Log fine) { Status Status::scan(jnixx::env env, jint pid) { FileBytes bytes = FileBytes(env, pid, "status"); - if (bytes.elements == NULL) + if (bytes.elements() == NULL) return Status(env, NULL); - Status s = ::scan(env, (const char*)bytes.elements, *this, GetFine(env)); + Status s = ::scan(env, (const char*)bytes.elements(), *this, GetFine(env)); bytes.release(); return s; } @@ -125,7 +125,7 @@ Status::scan(jnixx::env env, jint pid) { Status Status::scan(jnixx::env env, jnixx::byteArray buf) { ArrayBytes bytes = ArrayBytes(env, buf); - Status s = ::scan(env, (const char*)bytes.elements, *this, GetFine(env)); + Status s = ::scan(env, (const char*)bytes.elements(), *this, GetFine(env)); bytes.release(); return s; } diff --git a/frysk-sys/frysk/sys/ptrace/ChangeLog b/frysk-sys/frysk/sys/ptrace/ChangeLog index 4457863..687762e 100644 --- a/frysk-sys/frysk/sys/ptrace/ChangeLog +++ b/frysk-sys/frysk/sys/ptrace/ChangeLog @@ -1,3 +1,8 @@ +2008-05-21 Andrew Cagney <cagney@redhat.com> + + * jni/AddressSpace.cxx (AddressSpace::transfer): Use elements(). + * jni/RegisterSet.cxx (RegisterSet::transfer): Ditto. + 2008-05-20 Andrew Cagney <cagney@redhat.com> * jni/AddressSpace.cxx: Update; ByteArrayElements renamed to diff --git a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx index f78df28..a74c716 100644 --- a/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx +++ b/frysk-sys/frysk/sys/ptrace/jni/AddressSpace.cxx @@ -149,9 +149,9 @@ frysk::sys::ptrace::AddressSpace::transfer(::jnixx::env env, // extract or modify ArrayBytes bytes = ArrayBytes(env, byteArray); if (op == ptPeek) - memcpy(offset + i + bytes.elements, &w.b[woff], wlen); + memcpy(offset + i + bytes.elements(), &w.b[woff], wlen); else { - memcpy(&w.b[woff], offset + i + bytes.elements, wlen); + memcpy(&w.b[woff], offset + i + bytes.elements(), wlen); #if DEBUG fprintf(stderr, " poke 0x%lx", w.l); #endif diff --git a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx index 5aa1d04..6d09673 100644 --- a/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx +++ b/frysk-sys/frysk/sys/ptrace/jni/RegisterSet.cxx @@ -56,7 +56,7 @@ frysk::sys::ptrace::RegisterSet::transfer(::jnixx::env env, jint length) { verifyBounds(env, data, length); ArrayBytes bytes = ArrayBytes(env, data); - ptraceOp(env, op, pid, NULL, (long) bytes.elements); + ptraceOp(env, op, pid, NULL, (long) bytes.elements()); bytes.release(); } diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog index 1125275..f4c0d71 100644 --- a/frysk-sys/jnixx/ChangeLog +++ b/frysk-sys/jnixx/ChangeLog @@ -1,3 +1,19 @@ +2008-05-21 Andrew Cagney <cagney@redhat.com> + + * elements.hxx (class StringChars): Implement operator=, copy + constructor, add elements(), rename free() to release(). + (class StringArrayChars): Ditto. + (class Bytes): Add virtual elements() and length(), operator= and + copy constructor. + (class FileBytes): Implement. + (class ArrayBytes): Implement. + * elements.cxx (FileBytes::FileBytes): Update. + * Native.java (throwElements): New. + * TestJnixx.java (testElementRelease()): New. + * jni/Native.cxx (Native::throwElements): New. + * cni/Native.cxx (Native::throwElements): New. + * jni/Native.cxx (Native::throwElements): New. + 2008-05-20 Andrew Cagney <cagney@redhat.com> * JniBindings.java: Generate attributes such as no-return. diff --git a/frysk-sys/jnixx/Native.java b/frysk-sys/jnixx/Native.java index 82d857c..9cbdd54 100644 --- a/frysk-sys/jnixx/Native.java +++ b/frysk-sys/jnixx/Native.java @@ -58,4 +58,7 @@ abstract class Native { static native void throwRuntimeException(); static native boolean catchRuntimeException(Native e); + + static native void throwElements(String string, String[] stringArray, + byte[] bytes); } diff --git a/frysk-sys/jnixx/TestJnixx.java b/frysk-sys/jnixx/TestJnixx.java index d2c9465..b99b02f 100644 --- a/frysk-sys/jnixx/TestJnixx.java +++ b/frysk-sys/jnixx/TestJnixx.java @@ -85,4 +85,17 @@ public class TestJnixx extends TestCase { } })); } + + public void testElementsRelease() { + boolean thrown = false; + try { + Native.throwElements("a string", new String[] { + "a", "string", "array", + }, + new byte[] { 1, 2, 3, 4, 5, 6 }); + } catch (RuntimeException e) { + thrown = true; + } + assertTrue("thrown", thrown); + } } diff --git a/frysk-sys/jnixx/cni/Native.cxx b/frysk-sys/jnixx/cni/Native.cxx index 26ced9f..7e83df1 100644 --- a/frysk-sys/jnixx/cni/Native.cxx +++ b/frysk-sys/jnixx/cni/Native.cxx @@ -86,3 +86,10 @@ jnixx::Native::catchRuntimeException(jnixx::Native* e) { return true; } } + +void +jnixx::Native::throwElements(jstring string, + jstringArray stringArray, + jbyteArray bytes) { + throw new java::lang::RuntimeException(JvNewStringUTF("oops!")); +} diff --git a/frysk-sys/jnixx/elements.cxx b/frysk-sys/jnixx/elements.cxx index 65b3315..dd15213 100644 --- a/frysk-sys/jnixx/elements.cxx +++ b/frysk-sys/jnixx/elements.cxx @@ -45,6 +45,7 @@ #include <stdio.h> #include <unistd.h> #include <stdlib.h> +#include <string.h> #include "jni.hxx" @@ -102,7 +103,47 @@ chars2strings(::jnixx::env env, char** argv) { } void -slurp(jnixx::env env, FileBytes& bytes, const char* file) { +FileBytes::operator=(const FileBytes& src) { + release(); + ::strcpy(this->file, src.file); + this->env = src.env; + // Don't copy the pointer. +} + +FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + if (::vsnprintf(file, sizeof file, fmt, ap) + >= (int) sizeof file) { + errnoException(env, errno, "vsnprintf"); + } + va_end(ap); + this->env = env; +} + +FileBytes::FileBytes(jnixx::env env, int pid, const char* name) { + // Convert the string into a file. + if (::snprintf(file, sizeof file, "/proc/%d/%s", pid, name) + >= (int) sizeof file) { + errnoException(env, errno, "snprintf"); + } + this->env = env; +} + +FileBytes::FileBytes(jnixx::env env, int pid, int tid, const char* name) { + // Convert the string into a file. + if (::snprintf(file, sizeof file, "/proc/%d/task/%d/%s", pid, tid, name) + >= (int) sizeof file) { + errnoException(env, errno, "snprintf"); + } + this->env = env; +} + +jsize +FileBytes::length() { + if (l >= 0) + return l; + // Attempt to open the file. int fd = ::open(file, O_RDONLY); if (fd < 0) { @@ -116,85 +157,63 @@ slurp(jnixx::env env, FileBytes& bytes, const char* file) { // reads are needed to confirm EOF. Allocating 2&BUFSIZE ensures // that there's always space for at least two reads. Ref SW #3370 jsize allocated = BUFSIZ * 2 + 1; - bytes.elements = (jbyte*) ::malloc(allocated); - if (bytes.elements == NULL) { + p = (jbyte*) ::malloc(allocated); + if (p == NULL) { errnoException(env, errno, "malloc"); } - bytes.length = 0; + l = 0; while (true) { // Attempt to fill the remaining buffer; less space for a // terminating NUL character. - int size = ::read(fd, bytes.elements + bytes.length, - allocated - bytes.length - 1); + int size = ::read(fd, p + l, allocated - l - 1); if (size < 0) { ::close(fd); - bytes.release(); + release(); // Abandon the read with elements == NULL. - return; + p = NULL; + l = 0; + return 0; } else if (size == 0) { break; } - bytes.length += size; + l += size; - if (bytes.length + BUFSIZ >= allocated) { + if (l + BUFSIZ >= allocated) { // Not enough space for the next ~BUFSIZ'd read; expand the // buffer. Don't trust realloc with the pointer; will need to // free the old buffer if something goes wrong. allocated += BUFSIZ; - jbyte *tmp = (jbyte*)::realloc(bytes.elements, allocated); + jbyte *tmp = (jbyte*)::realloc(p, allocated); if (tmp == NULL) { int err = errno; ::close(fd); - bytes.release(); + release(); errnoException(env, err, "realloc"); } - bytes.elements = tmp; + p = tmp; } } ::close(fd); // Null terminate the buffer. - bytes.elements[bytes.length] = '\0'; - bytes.length++; // count the trailing NUL -} - -FileBytes::FileBytes(jnixx::env env, const char* fmt, ...) { - // Convert the string into a file. - char file[FILENAME_MAX]; - va_list ap; - va_start(ap, fmt); - if (::vsnprintf(file, sizeof file, fmt, ap) >= FILENAME_MAX) { - errnoException(env, errno, "vsnprintf"); - } - va_end(ap); - slurp(env, *this, file); + p[l] = '\0'; + l++; // count the trailing NUL + return l; } -FileBytes::FileBytes(jnixx::env env, int pid, const char* name) { - // Convert the string into a file. - char file[FILENAME_MAX]; - if (::snprintf(file, sizeof file, "/proc/%d/%s", pid, name) >= FILENAME_MAX) { - errnoException(env, errno, "snprintf"); - } hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-05-21 18:12 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080521181222.31999.qmail@sourceware.org \ --to=cagney@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).