From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32039 invoked by alias); 21 May 2008 18:12:23 -0000 Received: (qmail 32014 invoked by uid 367); 21 May 2008 18:12:22 -0000 Date: Wed, 21 May 2008 18:12:00 -0000 Message-ID: <20080521181222.31999.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Overload = and copy in element classes; prevents copy leading to double free. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 14acd83ef32ae48dfd81962026102a522edb1931 X-Git-Newrev: ac46ba63440998b66f7038c8fe0efad8036186ff Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00260.txt.bz2 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 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 * 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 * 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 * jni/AddressSpace.cxx (AddressSpace::transfer): Use elements(). * jni/RegisterSet.cxx (RegisterSet::transfer): Ditto. frysk-sys/jnixx/ChangeLog 2008-05-21 Andrew Cagney * 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 + + * jni/Fork.cxx (spawn): Use elements(), not .p. + * jni/Signal.cxx-sh (frysk): Ditto. + 2008-05-20 Andrew Cagney * 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 + + * 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 * 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 + + * jni/AddressSpace.cxx (AddressSpace::transfer): Use elements(). + * jni/RegisterSet.cxx (RegisterSet::transfer): Ditto. + 2008-05-20 Andrew Cagney * 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 + + * 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 * 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 #include #include +#include #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