Projects
openEuler:24.03:SP1:Everything:64G
jetty
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 2
View file
_service:tar_scm:jetty.spec
Changed
@@ -12,7 +12,7 @@ %bcond_with jp_minimal Name: jetty Version: 9.4.16 -Release: 6 +Release: 7 Summary: Java Webserver and Servlet Container License: Apache-2.0 OR EPL-1.0 URL: http://www.eclipse.org/jetty/ @@ -28,6 +28,10 @@ Patch4: CVE-2021-34428.patch Patch5: CVE-2022-2047.patch Patch6: CVE-2022-2048.patch +Patch7: CVE-2023-26048.patch +Patch8: CVE-2023-26049.patch +Patch9: CVE-2023-36479.patch +Patch10: CVE-2023-40167.patch BuildRequires: maven-local mvn(javax.servlet:javax.servlet-api) < 4.0.0 BuildRequires: mvn(org.apache.felix:maven-bundle-plugin) @@ -796,6 +800,9 @@ %license LICENSE NOTICE.txt LICENSE-MIT %changelog +* Tue Oct 15 2024 wangkai <13474090681@163.com> - 9.4.16-7 +- Fix CVE-2023-26048,CVE-2023-26049,CVE-2023-36479,CVE-2023-40167 + * Thu Jul 18 2024 yaoxin <yao_xin001@hoperun.com> - 9.4.16-6 - License compliance rectification
View file
_service:tar_scm:CVE-2023-26048.patch
Added
@@ -0,0 +1,537 @@ +From: Markus Koschany <apo@debian.org> +Date: Tue, 26 Sep 2023 20:37:47 +0200 +Subject: CVE-2023-26048 + +Origin: https://github.com/eclipse/jetty.project/pull/9345 +--- + .../jetty/http/MultiPartFormInputStream.java | 76 +++++++----- + .../java/org/eclipse/jetty/server/MultiParts.java | 14 ++- + .../java/org/eclipse/jetty/server/Request.java | 127 ++++++++++++--------- + .../jetty/server/handler/ContextHandler.java | 4 + + .../jetty/util/MultiPartInputStreamParser.java | 24 +++- + 5 files changed, 158 insertions(+), 87 deletions(-) + +diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java +index 928f59c..a1092f7 100644 +--- a/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java ++++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java +@@ -60,11 +60,14 @@ import org.eclipse.jetty.util.log.Logger; + public class MultiPartFormInputStream + { + private static final Logger LOG = Log.getLogger(MultiPartFormInputStream.class); ++ private static final int DEFAULT_MAX_FORM_KEYS = 1000; + private static final MultiMap<Part> EMPTY_MAP = new MultiMap<>(Collections.emptyMap()); ++ private final MultiMap<Part> _parts; ++ private final int _maxParts; ++ private int _numParts = 0; + private InputStream _in; + private MultipartConfigElement _config; + private String _contentType; +- private MultiMap<Part> _parts; + private Throwable _err; + private File _tmpDir; + private File _contextTmpDir; +@@ -332,26 +335,42 @@ public class MultiPartFormInputStream + * @param contextTmpDir javax.servlet.context.tempdir + */ + public MultiPartFormInputStream(InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir) ++ { ++ this(in, contentType, config, contextTmpDir, DEFAULT_MAX_FORM_KEYS); ++ } ++ ++ /** ++ * @param in Request input stream ++ * @param contentType Content-Type header ++ * @param config MultipartConfigElement ++ * @param contextTmpDir javax.servlet.context.tempdir ++ * @param maxParts the maximum number of parts that can be parsed from the multipart content (0 for no parts allowed, -1 for unlimited parts). ++ */ ++ public MultiPartFormInputStream(InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir, int maxParts) ++ + { + _contentType = contentType; + _config = config; + _contextTmpDir = contextTmpDir; ++ _maxParts = maxParts; + if (_contextTmpDir == null) + _contextTmpDir = new File(System.getProperty("java.io.tmpdir")); + + if (_config == null) + _config = new MultipartConfigElement(_contextTmpDir.getAbsolutePath()); + ++ MultiMap<Part> parts = new MultiMap<>(); + if (in instanceof ServletInputStream) + { + if (((ServletInputStream)in).isFinished()) + { +- _parts = EMPTY_MAP; ++ parts = EMPTY_MAP; + _parsed = true; +- return; + } + } +- _in = new BufferedInputStream(in); ++ if (!_parsed) ++ _in = new BufferedInputStream(in); ++ _parts = parts; + } + + /** +@@ -495,16 +514,15 @@ public class MultiPartFormInputStream + if (_parsed) + return; + _parsed = true; +- ++ ++ MultiPartParser parser = null; ++ Handler handler = new Handler(); + try + { +- // initialize +- _parts = new MultiMap<>(); +- + // if its not a multipart request, don't parse it + if (_contentType == null || !_contentType.startsWith("multipart/form-data")) + return; +- ++ + // sort out the location to which to write the files + if (_config.getLocation() == null) + _tmpDir = _contextTmpDir; +@@ -518,10 +536,10 @@ public class MultiPartFormInputStream + else + _tmpDir = new File(_contextTmpDir, _config.getLocation()); + } +- ++ + if (!_tmpDir.exists()) + _tmpDir.mkdirs(); +- ++ + String contentTypeBoundary = ""; + int bstart = _contentType.indexOf("boundary="); + if (bstart >= 0) +@@ -530,22 +548,19 @@ public class MultiPartFormInputStream + bend = (bend < 0 ? _contentType.length() : bend); + contentTypeBoundary = QuotedStringTokenizer.unquote(value(_contentType.substring(bstart, bend)).trim()); + } +- +- Handler handler = new Handler(); +- MultiPartParser parser = new MultiPartParser(handler, contentTypeBoundary); +- ++ ++ parser = new MultiPartParser(handler, contentTypeBoundary); + byte data = new byte_bufferSize; + int len; + long total = 0; +- ++ + while (true) + { +- ++ + len = _in.read(data); +- ++ + if (len > 0) + { +- + // keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize + total += len; + if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize()) +@@ -553,30 +568,28 @@ public class MultiPartFormInputStream + _err = new IllegalStateException("Request exceeds maxRequestSize (" + _config.getMaxRequestSize() + ")"); + return; + } +- ++ + ByteBuffer buffer = BufferUtil.toBuffer(data); + buffer.limit(len); + if (parser.parse(buffer, false)) + break; +- ++ + if (buffer.hasRemaining()) + throw new IllegalStateException("Buffer did not fully consume"); +- + } + else if (len == -1) + { + parser.parse(BufferUtil.EMPTY_BUFFER, true); + break; + } +- + } +- ++ + // check for exceptions + if (_err != null) + { + return; + } +- ++ + // check we read to the end of the message + if (parser.getState() != MultiPartParser.State.END) + { +@@ -585,19 +598,23 @@ public class MultiPartFormInputStream + else + _err = new IOException("Incomplete Multipart"); + } +- ++ + if (LOG.isDebugEnabled()) + { + LOG.debug("Parsing Complete {} err={}", parser, _err); + } +- + } + catch (Throwable e) + { + _err = e; ++ ++ // Notify parser if failure occurs ++ if (parser != null) ++ parser.parse(BufferUtil.EMPTY_BUFFER, true); + } + } +- ++
View file
_service:tar_scm:CVE-2023-26049.patch
Added
@@ -0,0 +1,831 @@ +From: Markus Koschany <apo@debian.org> +Date: Tue, 26 Sep 2023 23:42:03 +0200 +Subject: CVE-2023-26049 + +Origin: https://github.com/eclipse/jetty.project/pull/9352 +--- + .../org/eclipse/jetty/http/CookieCompliance.java | 2 +- + .../org/eclipse/jetty/server/CookieCutter.java | 205 ++++++++++----- + .../org/eclipse/jetty/server/CookieCutterTest.java | 280 ++++++++++++++++----- + .../java/org/eclipse/jetty/server/RequestTest.java | 2 + + 4 files changed, 361 insertions(+), 128 deletions(-) + +diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/CookieCompliance.java b/jetty-http/src/main/java/org/eclipse/jetty/http/CookieCompliance.java +index b2d339c..d514c15 100644 +--- a/jetty-http/src/main/java/org/eclipse/jetty/http/CookieCompliance.java ++++ b/jetty-http/src/main/java/org/eclipse/jetty/http/CookieCompliance.java +@@ -22,4 +22,4 @@ package org.eclipse.jetty.http; + * The compliance for Cookie handling. + * + */ +-public enum CookieCompliance { RFC6265, RFC2965 } ++public enum CookieCompliance { RFC6265, RFC2965, RFC6265_LEGACY } +diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/CookieCutter.java b/jetty-server/src/main/java/org/eclipse/jetty/server/CookieCutter.java +index 5dce1cf..e28d262 100644 +--- a/jetty-server/src/main/java/org/eclipse/jetty/server/CookieCutter.java ++++ b/jetty-server/src/main/java/org/eclipse/jetty/server/CookieCutter.java +@@ -107,23 +107,24 @@ public class CookieCutter + _lastCookies=null; + _fieldList.add(_fields++,f); + } +- +- ++ + protected void parseFields() + { +- _lastCookies=null; +- _cookies=null; +- ++ _lastCookies = null; ++ _cookies = null; ++ + List<Cookie> cookies = new ArrayList<>(); + + int version = 0; + + // delete excess fields +- while (_fieldList.size()>_fields) ++ while (_fieldList.size() > _fields) ++ { + _fieldList.remove(_fields); +- +- StringBuilder unquoted=null; +- ++ } ++ ++ StringBuilder unquoted = null; ++ + // For each cookie field + for (String hdr : _fieldList) + { +@@ -132,25 +133,31 @@ public class CookieCutter + + Cookie cookie = null; + +- boolean invalue=false; +- boolean inQuoted=false; +- boolean quoted=false; +- boolean escaped=false; +- int tokenstart=-1; +- int tokenend=-1; ++ boolean invalue = false; ++ boolean inQuoted = false; ++ boolean quoted = false; ++ boolean escaped = false; ++ boolean reject = false; ++ int tokenstart = -1; ++ int tokenend = -1; + for (int i = 0, length = hdr.length(); i <= length; i++) + { +- char c = i==length?0:hdr.charAt(i); +- +- // System.err.printf("i=%d/%d c=%s v=%b q=%b/%b e=%b u=%s s=%d e=%d \t%s=%s%n" ,i,length,c==0?"|":(""+c),invalue,inQuoted,quoted,escaped,unquoted,tokenstart,tokenend,name,value); +- ++ char c = i == length ? 0 : hdr.charAt(i); ++ + // Handle quoted values for name or value + if (inQuoted) + { ++ boolean eol = c == 0 && i == hdr.length(); ++ if (!eol && _compliance != CookieCompliance.RFC2965 && isRFC6265RejectedCharacter(inQuoted, c)) ++ { ++ reject = true; ++ continue; ++ } ++ + if (escaped) + { +- escaped=false; +- if (c>0) ++ escaped = false; ++ if (c > 0) + unquoted.append(c); + else + { +@@ -160,7 +167,7 @@ public class CookieCutter + } + continue; + } +- ++ + switch (c) + { + case '"': +@@ -175,15 +182,24 @@ public class CookieCutter + continue; + + case 0: +- // unterminated quote, let's ignore quotes ++ // unterminated quote ++ if (_compliance == CookieCompliance.RFC6265) ++ continue; ++ // let's ignore quotes + unquoted.setLength(0); + inQuoted = false; + i--; + continue; +- ++ ++ case ';': ++ if (_compliance == CookieCompliance.RFC6265) ++ reject = true; ++ else ++ unquoted.append(c); ++ continue; ++ + default: + unquoted.append(c); +- continue; + } + } + else +@@ -191,7 +207,14 @@ public class CookieCutter + // Handle name and value state machines + if (invalue) + { +- // parse the value ++ boolean eol = c == 0 && i == hdr.length(); ++ if (!eol && _compliance == CookieCompliance.RFC6265 && isRFC6265RejectedCharacter(inQuoted, c)) ++ { ++ reject = true; ++ continue; ++ } ++ ++ // parse the cookie-value + switch (c) + { + case ' ': +@@ -199,19 +222,19 @@ public class CookieCutter + break; + + case ',': +- if (_compliance!=CookieCompliance.RFC2965) ++ if (_compliance != CookieCompliance.RFC2965) + { + if (quoted) + { + // must have been a bad internal quote. let's fix as best we can +- unquoted.append(hdr,tokenstart,i--); ++ unquoted.append(hdr, tokenstart, i--); + inQuoted = true; + quoted = false; + continue; + } +- if (tokenstart<0) ++ if (tokenstart < 0) + tokenstart = i; +- tokenend=i; ++ tokenend = i; + continue; + } + // fall through +@@ -226,8 +249,8 @@ public class CookieCutter + unquoted.setLength(0); + quoted = false; + } +- else if(tokenstart>=0) +- value = tokenend>=tokenstart?hdr.substring(tokenstart, tokenend+1):hdr.substring(tokenstart); ++ else if (tokenstart >= 0) ++ value = tokenend >= tokenstart ? hdr.substring(tokenstart, tokenend + 1) : hdr.substring(tokenstart); + else + value = ""; + +@@ -235,22 +258,22 @@ public class CookieCutter + { + if (name.startsWith("$")) + { +- if (_compliance==CookieCompliance.RFC2965) ++ if (_compliance == CookieCompliance.RFC2965) + {
View file
_service:tar_scm:CVE-2023-36479.patch
Added
@@ -0,0 +1,50 @@ +From: Markus Koschany <apo@debian.org> +Date: Wed, 27 Sep 2023 14:25:09 +0200 +Subject: CVE-2023-36479 + +The org.eclipse.jetty.servlets.CGI Servlet should not be used anymore. +Upstream recommends to use Fast CGI instead. + +Origin: https://github.com/eclipse/jetty.project/pull/9888 +--- + .../src/main/java/org/eclipse/jetty/servlets/CGI.java | 3 +++ + .../test-jetty-webapp/src/main/webapp/WEB-INF/web.xml | 11 ----------- + 2 files changed, 3 insertions(+), 11 deletions(-) + +diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java +index 6322290..55d8f9a 100644 +--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java ++++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java +@@ -67,7 +67,10 @@ import org.eclipse.jetty.util.log.Logger; + * <dt>ignoreExitState</dt> + * <dd>If true then do not act on a non-zero exec exit status")</dd> + * </dl> ++ * ++ * @deprecated do not use, no replacement, will be removed in a future release. + */ ++@Deprecated + public class CGI extends HttpServlet + { + private static final long serialVersionUID = -6182088932884791074L; +diff --git a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml +index 507771f..978595f 100644 +--- a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml ++++ b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml +@@ -121,17 +121,6 @@ + <url-pattern>/dispatch/*</url-pattern> + </servlet-mapping> + +- <servlet> +- <servlet-name>CGI</servlet-name> +- <servlet-class>org.eclipse.jetty.servlets.CGI</servlet-class> +- <load-on-startup>1</load-on-startup> +- </servlet> +- +- <servlet-mapping> +- <servlet-name>CGI</servlet-name> +- <url-pattern>/cgi-bin/*</url-pattern> +- </servlet-mapping> +- + <servlet> + <servlet-name>Chat</servlet-name> + <servlet-class>com.acme.ChatServlet</servlet-class>
View file
_service:tar_scm:CVE-2023-40167.patch
Added
@@ -0,0 +1,256 @@ +From: Markus Koschany <apo@debian.org> +Date: Tue, 26 Sep 2023 21:06:42 +0200 +Subject: CVE-2023-40167 + +Origin: https://github.com/eclipse/jetty.project/commit/e4d596eafc887bcd813ae6e28295b5ce327def47 +--- + .../java/org/eclipse/jetty/http/HttpParser.java | 47 +++++++------- + .../org/eclipse/jetty/http/HttpParserTest.java | 71 +++++----------------- + 2 files changed, 38 insertions(+), 80 deletions(-) + +diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +index 2abc4b6..c045498 100644 +--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java ++++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +@@ -501,7 +501,7 @@ public class HttpParser + /* Quick lookahead for the start state looking for a request method or a HTTP version, + * otherwise skip white space until something else to parse. + */ +- private boolean quickStart(ByteBuffer buffer) ++ private void quickStart(ByteBuffer buffer) + { + if (_requestHandler!=null) + { +@@ -512,7 +512,7 @@ public class HttpParser + buffer.position(buffer.position()+_methodString.length()+1); + + setState(State.SPACE1); +- return false; ++ return; + } + } + else if (_responseHandler!=null) +@@ -522,7 +522,7 @@ public class HttpParser + { + buffer.position(buffer.position()+_version.asString().length()+1); + setState(State.SPACE1); +- return false; ++ return; + } + } + +@@ -543,7 +543,7 @@ public class HttpParser + _string.setLength(0); + _string.append(t.getChar()); + setState(_requestHandler!=null?State.METHOD:State.RESPONSE_VERSION); +- return false; ++ return; + } + case OTEXT: + case SPACE: +@@ -561,7 +561,6 @@ public class HttpParser + throw new BadMessageException(HttpStatus.BAD_REQUEST_400); + } + } +- return false; + } + + /* ------------------------------------------------------------------------------- */ +@@ -979,12 +978,13 @@ public class HttpParser + switch (_header) + { + case CONTENT_LENGTH: ++ long contentLength = convertContentLength(_valueString); + if (_hasContentLength) + { + if(complianceViolation(MULTIPLE_CONTENT_LENGTHS)) + throw new BadMessageException(HttpStatus.BAD_REQUEST_400,MULTIPLE_CONTENT_LENGTHS.description); +- if (convertContentLength(_valueString)!=_contentLength) +- throw new BadMessageException(HttpStatus.BAD_REQUEST_400,MULTIPLE_CONTENT_LENGTHS.description); ++ if (contentLength != _contentLength) ++ throw new BadMessageException(HttpStatus.BAD_REQUEST_400, MULTIPLE_CONTENT_LENGTHS.getDescription()); + } + _hasContentLength = true; + +@@ -993,11 +993,8 @@ public class HttpParser + + if (_endOfContent != EndOfContent.CHUNKED_CONTENT) + { +- _contentLength=convertContentLength(_valueString); +- if (_contentLength <= 0) +- _endOfContent=EndOfContent.NO_CONTENT; +- else +- _endOfContent=EndOfContent.CONTENT_LENGTH; ++ _contentLength = contentLength; ++ _endOfContent = EndOfContent.CONTENT_LENGTH; + } + break; + +@@ -1085,15 +1082,21 @@ public class HttpParser + + private long convertContentLength(String valueString) + { +- try +- { +- return Long.parseLong(valueString); +- } +- catch(NumberFormatException e) ++ if (valueString == null || valueString.length() == 0) ++ throw new BadMessageException("Invalid Content-Length Value", new NumberFormatException()); ++ ++ long value = 0; ++ int length = valueString.length(); ++ ++ for (int i = 0; i < length; i++) + { +- LOG.ignore(e); +- throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Invalid Content-Length Value",e); ++ char c = valueString.charAt(i); ++ if (c < '0' || c > '9') ++ throw new BadMessageException("Invalid Content-Length Value", new NumberFormatException()); ++ ++ value = Math.addExact(Math.multiplyExact(value, 10L), c - '0'); + } ++ return value; + } + + /* ------------------------------------------------------------------------------- */ +@@ -1485,12 +1488,11 @@ public class HttpParser + _methodString=null; + _endOfContent=EndOfContent.UNKNOWN_CONTENT; + _header=null; +- if (quickStart(buffer)) +- return true; ++ quickStart(buffer); + } + + // Request/response line +- if (_state.ordinal()>= State.START.ordinal() && _state.ordinal()<State.HEADER.ordinal()) ++ if (_state.ordinal() < State.HEADER.ordinal()) + { + if (parseLine(buffer)) + return true; +@@ -1994,7 +1996,6 @@ public class HttpParser + } + + /* ------------------------------------------------------------------------------- */ +- @SuppressWarnings("serial") + private static class IllegalCharacterException extends BadMessageException + { + private IllegalCharacterException(State state,HttpTokens.Token token,ByteBuffer buffer) +diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java +index dc340c1..c1d59cd 100644 +--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java ++++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java +@@ -23,6 +23,7 @@ import static org.hamcrest.MatcherAssert.assertThat; + import static org.hamcrest.Matchers.contains; + import static org.hamcrest.Matchers.containsString; + import static org.hamcrest.Matchers.is; ++import static org.hamcrest.Matchers.notNullValue; + import static org.hamcrest.Matchers.nullValue; + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertFalse; +@@ -1653,7 +1654,7 @@ public class HttpParserTest + } + + @Test +- public void testUnknownReponseVersion() throws Exception ++ public void testUnknownResponseVersion() + { + ByteBuffer buffer = BufferUtil.toBuffer( + "HPPT/7.7 200 OK\r\n" +@@ -1797,65 +1798,21 @@ public class HttpParserTest + assertEquals(HttpParser.State.CLOSED, parser.getState()); + } + +- @Test +- public void testBadContentLength0() throws Exception +- { +- ByteBuffer buffer = BufferUtil.toBuffer( +- "GET / HTTP/1.0\r\n" +- + "Content-Length: abc\r\n" +- + "Connection: close\r\n" +- + "\r\n"); +- +- HttpParser.RequestHandler handler = new Handler(); +- HttpParser parser = new HttpParser(handler); +- +- parser.parseNext(buffer); +- assertEquals("GET", _methodOrVersion); +- assertEquals("Invalid Content-Length Value", _bad); +- assertFalse(buffer.hasRemaining()); +- assertEquals(HttpParser.State.CLOSE, parser.getState()); +- parser.atEOF(); +- parser.parseNext(BufferUtil.EMPTY_BUFFER); +- assertEquals(HttpParser.State.CLOSED, parser.getState()); +- } +- +- @Test +- public void testBadContentLength1() throws Exception +- { +- ByteBuffer buffer = BufferUtil.toBuffer( +- "GET / HTTP/1.0\r\n" +- + "Content-Length: 9999999999999999999999999999999999999999999999\r\n" +- + "Connection: close\r\n" +- + "\r\n"); +- +- HttpParser.RequestHandler handler = new Handler(); +- HttpParser parser = new HttpParser(handler); +-
View file
_service
Changed
@@ -2,7 +2,7 @@ <service name="tar_scm"> <param name="scm">git</param> <param name="url">git@gitee.com:src-openeuler/jetty.git</param> - <param name="revision">openEuler-24.03-LTS-Next</param> + <param name="revision">openEuler-24.03-LTS-SP1</param> <param name="exclude">*</param> <param name="extract">*</param> </service>
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2