[jcifs] jcifs-1.1.9 ArrayIndexOutOfBoundsException: -2146866174

madlg3 at vodafone.es madlg3 at vodafone.es
Tue Mar 1 10:12:59 GMT 2005


Hi Mike,

I modified the T2 crawler in order to simulate several users performing 
crawling and getting all ".doc" files. When I ran the test for 50 users 
I got an exception like this:

java -Xms1024M -Xmx1024M -cp ".;jcifs-1.1.9.jar" 
T2Crawler "smb://euk;euk:stinker@euk/euk-archive/" 50

java.lang.ArrayIndexOutOfBoundsException: -2146866174
        at jcifs.smb.ServerMessageBlock.readInt4
(ServerMessageBlock.java:137)
        at jcifs.smb.Trans2FindFirst2Response.readDataWireFormat
(Trans2FindFirst
        at jcifs.smb.SmbComTransactionResponse.readBytesWireFormat
(SmbComTransac
        at jcifs.smb.ServerMessageBlock.readWireFormat
(ServerMessageBlock.java:4
        at jcifs.smb.SmbTransport.run(SmbTransport.java:455)
        at java.lang.Thread.run(Thread.java:534)
smb://euk;euk:stinker@euk/euk-archive/19701011/Nokia/Poly So
jcifs.smb.SmbException: Timeout waiting for response from server: 
euk/10.21
        at jcifs.smb.SmbTransport.sendTransaction(SmbTransport.java:832)
        at jcifs.smb.SmbSession.sendTransaction(SmbSession.java:246)
        at jcifs.smb.SmbTree.sendTransaction(SmbTree.java:74)
        at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:689)
        at jcifs.smb.SmbFile.queryPath(SmbFile.java:1230)
        at jcifs.smb.SmbFile.exists(SmbFile.java:1285)
        at jcifs.smb.SmbFile.isDirectory(SmbFile.java:1358)
        at T2Crawler$CrawlerThread.run(T2Crawler.java:84)
smb://euk;euk:stinker@euk/euk-archive/19710607/jdk1.3.1_06/d
jcifs.smb.SmbException: Timeout waiting for response from server: 
euk/10.21
smb://euk;euk:stinker@euk/euk-archive/19710607/javadocs/2003
        at jcifs.smb.SmbSession.sendTransaction(SmbSession.java:246)

smb://euk;euk:stinker@euk/euk-archive/19701011/Nokia/Poly So

        at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:689)
        at jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1715)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1606)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1514)
        at T2Crawler$CrawlerThread.run(T2Crawler.java:74)
jcifs.smb.SmbException: Timeout waiting for response from server: 
euk/10.21
        at jcifs.smb.SmbTransport.sendTransaction(SmbTransport.java:832)
        at jcifs.smb.SmbSession.sendTransaction(SmbSession.java:246)
        at jcifs.smb.SmbTree.sendTransaction(SmbTree.java:74)
        at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:689)
        at jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1715)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1606)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1514)
        at T2Crawler$CrawlerThread.run(T2Crawler.java:74)
jcifs.smb.SmbException: Timeout waiting for response from server: 
euk/10.21
        at jcifs.smb.SmbTransport.sendTransaction(SmbTransport.java:832)
        at jcifs.smb.SmbSession.sendTransaction(SmbSession.java:246)
        at jcifs.smb.SmbTree.sendTransaction(SmbTree.java:74)
        at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:689)
        at jcifs.smb.SmbFile.queryPath(SmbFile.java:1230)
        at jcifs.smb.SmbFile.exists(SmbFile.java:1285)
        at jcifs.smb.SmbFile.isDirectory(SmbFile.java:1358)
        at T2Crawler$CrawlerThread.run(T2Crawler.java:84)
smb://euk;euk:stinker@euk/euk-archive/19710607/jdk1.3.1_06/d
java.lang.NullPointerException
        at jcifs.smb.SmbTransport.sendTransaction(SmbTransport.java:795)
        at jcifs.smb.SmbSession.sendTransaction(SmbSession.java:246)
        at jcifs.smb.SmbTree.sendTransaction(SmbTree.java:74)
        at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:689)
        at jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1715)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1606)
        at jcifs.smb.SmbFile.listFiles(SmbFile.java:1514)
        at T2Crawler$CrawlerThread.run(T2Crawler.java:74)
smb://euk;euk:stinker@euk/euk-archive/19710607/jdk1.3.1_06/d

------------------------------------------------------------------------
------

The modified T2crawler code is as follows:

import jcifs.smb.SmbFile;
import jcifs.util.*;
import java.util.LinkedList;
import java.util.ListIterator;
import java.net.MalformedURLException;
import java.io.IOException;
import jcifs.smb.*;

public class T2Crawler extends Thread {

    class Semaphore {
        private int value = 0;

        Semaphore() {value = 0;}
        Semaphore(int initial) {value = initial;}

        public synchronized void P() {
            value--;
            if (value < 0) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        public synchronized void V() {
            value++;
            notify();
        }
    }

    class CrawlerThread extends Thread {
        LinkedList list;
        Semaphore sem;
        SmbFile dir;
        int depth;


        CrawlerThread( SmbFile dir, Semaphore sem, int depth ) {
            this.dir = dir;
            list = new LinkedList();
            list.add( dir );
            this.sem = sem;
            this.depth = depth;
        }

        public void run() {
            SmbFile d;
            SmbFile l[];

            while( list.isEmpty() == false ) {
                int i;
                d = (SmbFile)list.remove( 0 );
                try {
                    l = d.listFiles();

/* This is flawed. It decrements depth too agressively and causes the
 * thread to finish prematurely. I do not know of a way to fix this
 * because there is no concept of a stack here.
 */
                    depth--;
                    for( i = 0; i < l.length; i++ ) {
                        //System.out.println( l[i] );
                    //  if( depth++ > 0 && l[i].isDirectory() && !l
[i].isHidden() ) {
                        if( depth > 0 && l[i].isDirectory() ) {
                            list.add( l[i] );
                        }
                        else
                        {
                            if(l[i].getName().endsWith(".doc"))
                               {
                                   System.out.println(getName() + " " 
+ "Getting file: " + l[i].getCanonicalPath());
                                   SmbFileInputStream 
smbfileinputstream = new SmbFileInputStream(l[i]);
                                   //FileOutputStream fileoutputstream 
= new FileOutputStream(smbfileext.getName());
                                   long lt = System.currentTimeMillis();
                                   byte abyte0[] = new byte[8192];
                                   int i1 = 0;
                                   long l1 = lt;
                                   int k;
                                   while((k = smbfileinputstream.read
(abyte0)) > 0)
                                   {
                                       //fileoutputstream.write(abyte0, 
0, k);
                                       i1 += k;
                                   }
                                   long l2 = System.currentTimeMillis
() - lt;
                                   System.out.println(i1 + " bytes 
transfered in " + l2 / 1000L + " seconds at " + (long)(i1 / 1000) / 
Math.max(1L, l2 / 1000L) + "Kbytes/sec");
                                   smbfileinputstream.close();
                                   //fileoutputstream.close();
                               }

                        
                        }
                    }
                } catch( Exception e ) {
                    System.out.println( d );
                    e.printStackTrace();
                }
            }
            sem.V();
        }
    }

public void run()            
 {
     
     try{
         SmbFile[] l = top.listFiles();
         dpth--;
         for (int i = 0; i < l.length; i++) {
             try {
                // System.out.println(l[i]);
                 if (!l[i].isDirectory() || l[i].isHidden()) {
                     continue;
                 }
                 else
                     System.out.println(this.getName()+" crawling "+l
[i]);
                 if (dpth > 0) {
                     sem.P();
                     (new CrawlerThread(l[i], sem, dpth)).start();
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
         for (int i = 0; i < l.length; i++) {
             l[i].canRead();
         }
         
         System.out.println(this.getName()+" Crawling finished ");
     
     }catch(Exception smbE){
         smbE.printStackTrace();
      }
    }
   
    
    SmbFile top ;
    Semaphore sem;
    String dir;
    int numThr;
    int dpth;
    
    T2Crawler( String dir, int numThreads, int depth, String nombre ) 
throws Exception {
        super(nombre);
        top = new SmbFile( dir );
        sem = new Semaphore( numThreads );
        this.dir = dir;
        this.numThr = numThreads;
        dpth = depth;
        System.out.println("Starting user "+nombre);
        
      
    }
    public  static void main(String[] argv) throws Exception {
        if( argv.length != 2) {
            System.out.println( "$ java -Djcifs.properties=miallen.prp 
T2Crawler <dir> <num users> ");
            System.exit(1);
        }
        for(int i=0;i<Integer.parseInt(argv[1]);i++)
        {
            T2Crawler t2 = new T2Crawler(argv[0], 1, 500,"User_"+i);
            t2.start();
            
        }
    }
}


Do you have any idea about this problem?With older versions of jcifs 
this didn´t occur. Before 1.1.19 I had problems with HP-UX machines 
firing the EOF exception you commented on the 1.1.9 release 
description. This problem never ocurred in Linux, windows and solaris 
machines executing the same code to access the same share with same 
number of users, do you have any idea why the HP-Ux machinew were 
having this problem (I tried with PA-Risc and True64 and both had the 
problem)

Regards,

Miguel

----- Mensaje Original -----
De: Michael B Allen <mba2000 at ioplex.com>
Fecha: Lunes, Febrero 28, 2005 9:16 am
Asunto: [jcifs] jcifs-1.1.9 released / Read Error

> When multiplexing I/O, if socket buffers fill up such that packets 
> can be
> read in fragments (i.e. high load), it was possible for the 4 byte 
> NetBIOSheader to be read incorrectly resulting in a bogus 
> "unexpected EOF reading
> netbios session header" exception. This problem has been fixed. 
> Also, some
> small javadoc updates have been applied.
> 
> -- 
> IRC - where men are men, women are men, and the boys are FBI agents.
> 



More information about the jcifs mailing list