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: link
Be 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).