Kamal Deep Singh

66 papers B 11C 4Journal 23Unranked 28
YearRankTypeTitle / Venue / Authors
2026 conf
ICAART (2)
Ahlem Harhad, Cyril Drocourt, David Durand, Guillaume Muller, Kamal Deep Singh, Abdoulaye Sene, Gil Utard
2024 B conf
WiMob
Ahcene Boumhand, Kamal Deep Singh, Yassine Hadjadj-Aoul, Matthieu Liewig, César Viho
2024 C conf
ISNCC
Karthika Satheesh, Kamal Deep Singh, Sid Ali Hamideche, Marie-Line Alberi-Morel, César Viho
2023 conf
GLOBECOM (Workshops)
Sid Ali Hamideche, Marie-Line Alberi-Morel, Kamal Deep Singh, César Viho
2023 J jnl
IEEE Trans. Ind. Informatics
Ons Aouedi, Kandaraj Piamrat, Guillaume Muller, Kamal Deep Singh
2023 C conf
ISCC
Ahcene Boumhand, Kamal Deep Singh, Yassine Hadjadj-Aoul, Matthieu Liewig, César Viho
2022 conf
CCNC
Ons Aouedi, Kandaraj Piamrat, Guillaume Muller, Kamal Deep Singh
2022 J jnl
IEEE Trans. Cogn. Commun. Netw.
Marie-Line Alberi-Morel, Illyyne Saffar, Kamal Deep Singh, Sid Ali Hamideche, César Viho
2022 conf
WMNC
Sid Ali Hamideche, Marie-Line Alberi-Morel, Kamal Deep Singh, César Viho
2022 conf
ICC
Ons Aouedi, Kandaraj Piamrat, Guillaume Muller, Kamal Deep Singh
2021 J jnl
IEEE Trans. Computers
Hamed Rahimi, Yvan Picaud, Kamal Deep Singh, Giyyarpuram Madhusudan, Salvatore Costanzo, Olivier Boissier
2021 J jnl
IEEE Access
Amro Najjar, Yazan Mualla, Kamal Deep Singh, Gauthier Picard, Davide Calvaresi, Avleen Malhi, Stéphane Galland, Kary Främling
2021 J jnl
CoRR
Ngurah Indra Er, Kamal Deep Singh, Christophe Couturier, Jean-Marie Bonnin
2020 J jnl
CoRR
Hamed Rahimi, Yvan Picaud, Salvatore Costanzo, Giyyarpuram Madhusudan, Olivier Boissier, Kamal Deep Singh
2019 B conf
WiMob
Ngurah Indra Er, Kamal Deep Singh, Jean-Marie Bonnin
2019 conf
CCNC
Ngurah Indra Er, Kamal Deep Singh, Jean-Marie Bonnin
2019 B conf
GLOBECOM
Illyyne Saffar, Marie-Line Alberi-Morel, Kamal Deep Singh, César Viho
2019 conf
CCNC
Illyyne Saffar, Marie-Line Alberi-Morel, Kamal Deep Singh, César Viho
2019 conf
WMNC
Illyyne Saffar, Marie-Line Alberi-Morel, Mohanned Amara, Kamal Deep Singh, César Viho
2019 conf
INFOCOM Workshops
Pham Tran Anh Quang, Abbas Bradai, Kamal Deep Singh, Yassine Hadjadj-Aoul
2019 B conf
WiOpt
Marie-Line Alberi-Morel, Illyyne Saffar, Kamal Deep Singh, César Viho
2019 conf
ICC
Illyyne Saffar, Marie-Line Alberi-Morel, Kamal Deep Singh, César Viho
2019 J jnl
IEEE Trans. Netw. Serv. Manag.
Pham Tran Anh Quang, Abbas Bradai, Kamal Deep Singh, Gauthier Picard, Roberto Riggio
2018 C conf
WOWMOM
Pham Tran Anh Quang, Abbas Bradai, Kamal Deep Singh, Roberto Riggio
2018 J jnl
Ad Hoc Networks
Pham Tran Anh Quang, Kamal Deep Singh, Juan Antonio Rodríguez-Aguilar, Gauthier Picard, Kandaraj Piamrat, Jesús Cerquides, César Viho
2018 J jnl
Knowl. Inf. Syst.
Dennis Diefenbach, Vanessa López, Kamal Deep Singh, Pierre Maret
2018 conf
JFSMA
Amro Najjar, Yazan Mualla, Gauthier Picard, Kamal Deep Singh
2018 conf
ICC
Pham Tran Anh Quang, Kamal Deep Singh, Abbas Bradai, Abderrahim Benslimane
2018 J jnl
CoRR
Dennis Diefenbach, Andreas Both, Kamal Deep Singh, Pierre Maret
2018 conf
WWW (Companion Volume)
Dennis Diefenbach, Kamal Deep Singh, Pierre Maret
2017 conf
ISWC (Posters, Demos & Industry Tracks)
Dennis Diefenbach, Thomas Pellissier Tanon, Kamal Deep Singh, Pierre Maret
2017 conf
BLINK/NLIWoD3@ISWC
Dennis Diefenbach, Youssef Dridi, Kamal Deep Singh, Pierre Maret
2017 conf
ESWC (Satellite Events)
Dennis Diefenbach, Shanzay Amjad, Andreas Both, Kamal Deep Singh, Pierre Maret
2017 J jnl
IEEE Trans. Veh. Technol.
Pham Tran Anh Quang, Kandaraj Piamrat, Kamal Deep Singh, César Viho
2017 conf
SemWebEval@ESWC
Dennis Diefenbach, Kamal Deep Singh, Pierre Maret
2016 conf
WIMS
Dennis Diefenbach, Ricardo Usbeck, Kamal Deep Singh, Pierre Maret
2016 J jnl
Comput. Commun.
Priyanka Rawat, Kamal Deep Singh, Jean-Marie Bonnin
2016 conf
OnlineGreenComm
Hussein Al Haj Hassan, Kamal Deep Singh, Loutfi Nuaymi
2016 conf
CCNC
Pham Tran Anh Quang, Kandaraj Piamrat, Kamal Deep Singh, César Viho
2016 B conf
PIMRC
Pham Tran Anh Quang, Kandaraj Piamrat, Kamal Deep Singh, César Viho
2016 J jnl
Wirel. Networks
Pham Tran Anh Quang, Kandaraj Piamrat, Kamal Deep Singh, César Viho
2016 J jnl
Mob. Inf. Syst.
Jong-Hyouk Lee, Kamal Deep Singh, Yassine Hadjadj-Aoul, Neeraj Kumar
2015 J jnl
IEEE Commun. Mag.
Abbas Bradai, Kamal Deep Singh, Toufik Ahmed, Tinku Rasheed
2015 B conf
IWCMC
Abbas Bradai, Kamal Deep Singh, Abderrezak Rachedi, Toufik Ahmed
2015 J jnl
J. Netw. Comput. Appl.
Abbas Bradai, Abderrahim Benslimane, Kamal Deep Singh
2015 J jnl
Pervasive Mob. Comput.
Abbas Bradai, Kamal Deep Singh, Abderrezak Rachedi, Toufik Ahmed
2015 conf
DEBS
Syed Gillani, Abderrahmen Kammoun, Julien Subercaze, Kamal Deep Singh, Gauthier Picard, Frédérique Laforest
2014 J jnl
EURASIP J. Wirel. Commun. Netw.
Kamal Deep Singh, Priyanka Rawat, Jean-Marie Bonnin
2014 J jnl
J. Inform. and Commun. Convergence Engineering
Hyunhee Park, Kandaraj Piamrat, Kamal Deep Singh
2014 J jnl
J. Inform. and Commun. Convergence Engineering
Hyunhee Park, Kamal Deep Singh, Kandaraj Piamrat
2014 J jnl
IEEE Internet Comput.
Jong-Hyouk Lee, Kamal Deep Singh, Jean-Marie Bonnin, Sangheon Pack
2014 J jnl
Comput. Commun.
Nabil Benamar, Kamal Deep Singh, Maria Benamar, Moulay Driss El Ouadghiri, Jean-Marie Bonnin
2014 J jnl
J. Supercomput.
Priyanka Rawat, Kamal Deep Singh, Hakima Chaouchi, Jean-Marie Bonnin
2013 B conf
PIMRC
Kamal Deep Singh, Kandaraj Piamrat, Hyunhee Park, César Viho, Jean-Marie Bonnin
2012 conf
ITST
Kamal Deep Singh, Jean-Marie Bonnin, David Ros
2012 conf
CCNC
Kamal Deep Singh, Yassine Hadjadj-Aoul, Gerardo Rubino
2011 conf
ICC
Kamal Deep Singh, Adlen Ksentini, Baptiste Marienval
2010 conf
WTS
Kamal Deep Singh, Gerardo Rubino
2010 B conf
WCNC
Kandaraj Piamrat, Kamal Deep Singh, Adlen Ksentini, César Viho, Jean-Marie Bonnin
2008 B conf
GLOBECOM
Kamal Deep Singh, Julio Orozco, David Ros, Gerardo Rubino
2007 B conf
GLOBECOM
Kamal Deep Singh, David Ros
2007 conf
VTC Fall
Kamal Deep Singh, David Ros, Laurent Toutain, César Viho
2007 C conf
ISCC
Kamal Deep Singh, David Ros
2006 conf
VTC Fall
Kamal Deep Singh, David Ros, Laurent Toutain, César Viho
2004 conf
ICC
Ana Carolina Minaburo, Kamal Deep Singh, Laurent Toutain, Loutfi Nuaymi
2003 B conf
PIMRC
Ana Minaburo, Loutfi Nuaymi, Kamal Deep Singh, Laurent Toutain
redb/extractors/decompiler/apk/jadx_wrapper.py
← Index redb/extractors/decompiler/apk/jadx_wrapper.py python
"""JADX decompiler subprocess wrapper.

Manages JADX subprocess execution for Java decompilation,
following the CAPA extractor subprocess pattern.
"""

import os
import re
import signal
import subprocess
from typing import Dict, Optional


class JADXDecompiler:
    """Subprocess wrapper for JADX Java decompilation."""

    def __init__(self, jadx_path: str = None, timeout: int = None, log=None):
        self.jadx_path = jadx_path or os.getenv("JADX_PATH", "jadx")
        self.timeout = timeout or int(os.getenv("JADX_TIMEOUT", "300"))
        self.log = log

    def decompile(self, apk_path: str, output_dir: str) -> bool:
        """Run JADX decompilation on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.jadx_path,
            "--no-res",
            "--no-imports",
            "--threads-count", "2",
            "--output-dir", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"JADX returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    # JADX may still produce partial output on non-zero exit
                    return os.path.isdir(os.path.join(output_dir, "sources"))
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"JADX timed out after {self.timeout}s"
                    )
                # Kill the process group
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"JADX not found at '{self.jadx_path}'. "
                    "Install JADX or set JADX_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"JADX execution error: {e}")
            return False

    def parse_java_methods(self, output_dir: str) -> Dict[str, str]:
        """Parse JADX output into per-method Java source.

        Returns dict keyed by 'package.ClassName.methodName(ParamType1, ParamType2)'.
        """
        sources_dir = os.path.join(output_dir, "sources")
        if not os.path.isdir(sources_dir):
            return {}

        methods = {}
        for root, _dirs, files in os.walk(sources_dir):
            for fname in files:
                if not fname.endswith(".java"):
                    continue
                fpath = os.path.join(root, fname)
                try:
                    with open(fpath, "r", encoding="utf-8", errors="replace") as f:
                        content = f.read()

                    # Derive the fully qualified class name from file path
                    rel_path = os.path.relpath(fpath, sources_dir)
                    class_fqn = rel_path.replace(os.sep, ".").replace("/", ".")
                    if class_fqn.endswith(".java"):
                        class_fqn = class_fqn[:-5]

                    file_methods = self._extract_methods_from_java(
                        content, class_fqn
                    )
                    methods.update(file_methods)

                except Exception:
                    continue

        return methods

    def _extract_methods_from_java(
        self, source: str, class_fqn: str
    ) -> Dict[str, str]:
        """Extract individual methods from a Java source file.

        Uses brace-depth tracking to find method boundaries.
        """
        methods = {}
        lines = source.split("\n")
        i = 0

        while i < len(lines):
            line = lines[i]
            match = self._is_method_declaration(line)
            if match:
                method_name, param_types = match
                # Track brace depth to find method end
                start_line = i
                brace_depth = 0
                found_open = False

                for j in range(i, len(lines)):
                    for ch in lines[j]:
                        if ch == "{":
                            brace_depth += 1
                            found_open = True
                        elif ch == "}":
                            brace_depth -= 1

                    if found_open and brace_depth == 0:
                        method_body = "\n".join(lines[start_line : j + 1])
                        key = f"{class_fqn}.{method_name}({param_types})"
                        methods[key] = method_body
                        i = j + 1
                        break
                else:
                    i += 1
            else:
                i += 1

        return methods

    # Regex for method declarations (not constructors, not class/interface decl)
    _METHOD_DECL_RE = re.compile(
        r"^\s*(?:(?:public|private|protected|static|final|synchronized|"
        r"native|abstract|strictfp)\s+)*"
        r"(?:[\w<>\[\]?.]+\s+)"  # return type
        r"(\w+)"  # method name
        r"\s*\(([^)]*)\)"  # parameters
        r"(?:\s*throws\s+[\w.,\s]+)?"
        r"\s*\{"
    )

    def _is_method_declaration(self, line: str) -> Optional[tuple]:
        """Check if a line is a method declaration.

        Returns (method_name, param_types_str) or None.
        """
        m = self._METHOD_DECL_RE.match(line)
        if not m:
            return None

        method_name = m.group(1)
        params_raw = m.group(2).strip()

        # Skip class-level blocks
        if method_name in ("if", "for", "while", "switch", "try", "catch"):
            return None

        # Extract just the type names from parameters
        if not params_raw:
            return (method_name, "")

        param_types = []
        for param in params_raw.split(","):
            param = param.strip()
            if not param:
                continue
            parts = param.split()
            # Last non-annotation token before the variable name is the type
            # Simple heuristic: type is second-to-last, name is last
            if len(parts) >= 2:
                param_types.append(parts[-2])
            elif len(parts) == 1:
                param_types.append(parts[0])

        return (method_name, ", ".join(param_types))