Program: 24684
Project: 24684
Buggy source:
private void init(){
  if (params != null)   return;
  params=new HashMap<String,ArrayList<String>>();
  Enumeration paramNames=inReq.getParameterNames();
  while (paramNames.hasMoreElements()) {
    String paramName=(String)paramNames.nextElement();
    String[] vals=inReq.getParameterValues(paramName);
    for (    String val : vals) {
      if (val.indexOf(';') < 0) {
        if (!paramName.equals("String_Node_Str"))         addParam(paramName,val);
        continue;
      }
      StringTokenizer tokenizer=new StringTokenizer(val,"String_Node_Str");
      String name=paramName;
      StringBuffer valbuf=new StringBuffer();
      while (tokenizer.hasMoreTokens()) {
        String tok=tokenizer.nextToken();
        int equalPos=-1;
        boolean inQuote=false;
        for (int i=0; i < tok.length() && equalPos < 0; i++) {
          if (tok.charAt(i) == '"')           inQuote=!inQuote;
 else           if (!inQuote && tok.charAt(i) == '=')           equalPos=i;
        }
        equalPos=tok.indexOf('=');
        if (equalPos >= 0) {
          if (!name.equals("String_Node_Str"))           addParam(name,valbuf.toString());
          valbuf.setLength(0);
          name=tok.substring(0,equalPos);
          valbuf.append(tok.substring(equalPos + 1));
        }
 else {
          if (valbuf.length() > 0)           valbuf.append("String_Node_Str");
          valbuf.append(tok);
        }
      }
      if (!name.equals("String_Node_Str"))       addParam(name,valbuf.toString());
    }
  }
}

Fixed version (ground truth):
private void init(){
  if (params != null)   return;
  paramNames=new ArrayList();
  params=new HashMap();
  Enumeration paramNames=inReq.getParameterNames();
  while (paramNames.hasMoreElements()) {
    String paramName=(String)paramNames.nextElement();
    String[] vals=inReq.getParameterValues(paramName);
    for (    String val : vals) {
      if (val.indexOf(';') < 0) {
        if (!paramName.equals("String_Node_Str"))         addParam(paramName,val);
        continue;
      }
      try {
        val=protectChars(paramName,val);
      }
 catch (      Throwable t) {
        Trace.warning("String_Node_Str" + t.toString());
      }
      StringTokenizer tokenizer=new StringTokenizer(val,"String_Node_Str");
      String name=paramName;
      StringBuffer valbuf=new StringBuffer();
      while (tokenizer.hasMoreTokens()) {
        String tok=tokenizer.nextToken();
        int equalPos=-1;
        boolean inQuote=false;
        for (int i=0; i < tok.length() && equalPos < 0; i++) {
          if (tok.charAt(i) == '"')           inQuote=!inQuote;
 else           if (!inQuote && tok.charAt(i) == '=')           equalPos=i;
        }
        equalPos=tok.indexOf('=');
        if (equalPos >= 0) {
          if (!name.equals("String_Node_Str"))           addParam(name,valbuf.toString());
          valbuf.setLength(0);
          name=unprotectChars(tok.substring(0,equalPos));
          valbuf.append(unprotectChars(tok.substring(equalPos + 1)));
        }
 else {
          if (valbuf.length() > 0)           valbuf.append("String_Node_Str");
          valbuf.append(unprotectChars(tok));
        }
      }
      if (!name.equals("String_Node_Str"))       addParam(name,valbuf.toString());
    }
  }
}